Здравствуйте. Требуется помощь с настройкой nginx location. Требуется, чтобы url несуществующих php скриптов обрабатывался /admin/router.php. Как реализовать?
Можно так попробовать PHP: server { ... location / { try_files $uri $uri/ /admin/router.php$is_args$args; } ... }
Логично предположить, что для ссылок вида *.php у тебя заведено отдельное правило location и оно срабатывает (внезапно™)! это нормально --- Добавлено --- можешь попробовать изменить это правило так, чтобы оно срабатывало не на любой .php, а только на конкретный index.php или что там у тебя. тогда все остальные отстутствующие адреса, в т.ч. с окончанием .php, будут обрабатываться правилом для отсутствующих файлов. — К.О.
PHP: server { ... location / { try_files $uri $uri/ /admin/router.php$is_args$args; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php5-fpm.sock; try_files $uri =404; } ... } Не проверял, но можно попробовать так PHP: server { ... location / { try_files $uri $uri/ /admin/router.php$is_args$args; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php5-fpm.sock; try_files $uri $uri/ /admin/router.php$is_args$args; } ... }
почему вы думаете, что роутеру аргументы нужны? давно уже всё в реквест ури сидит. --- Добавлено --- пример из доки с собачкой: Код (Text): Example for Drupal/FastCGI: location / { try_files $uri $uri/ @drupal; } location ~ \.php$ { try_files $uri @drupal; fastcgi_pass ...; fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param QUERY_STRING $args; ... other fastcgi_param's } location @drupal { fastcgi_pass ...; fastcgi_param SCRIPT_FILENAME /path/to/index.php; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param QUERY_STRING q=$uri&$args; ... other fastcgi_param's }
надо посмотреть код роутера, чтобы понять, каким раком он выковыривает аргументы. может и нужны. но последние годы все роутеры парсят $_SERVER['REQUEST_URI'] и в ус не дуют.
Всем спасибо. Такое решение помогло: Код (Text): location ~ \.php$ { try_files $uri $uri/ /admin/router.php$is_args$args; include fastcgi_params; fastcgi_pass php; } А как теперь сделать, для всех несуществующих файлов кроме ".php", смотреть в admin/...? Т.е. /include/alfpha/style.css если не существуют, смотрим в /admin/alfpha/style.css
location ~ /include/(.*)(?!(\.php$)) { try_files $uri $uri/ /var/www/admin/$1 /var/www/admin/$1/ =404; } как-то так
@igordata а кто тебе сказал что я твой пинпай не люблю? Я тебя уважаю за этот движок, я горжусь что ты не зассал и толкаешь продукт в массы. Есть маленькая доля вероятности что они просто нахер не нужен в моих проектах
@igordata PHP: location ~ /include/(.*)(?!(\.php$)) { try_files $uri $uri/ /var/www/admin/$1 /var/www/admin/$1/ =404; } Это работает для каталога include/... А как динамически сделать для всех каталогов? Пробовал: PHP: location ~ /(.*)/(.*)(?!(\.php$)) { try_files $uri $uri/ /var/www/admin/$2 /var/www/admin/$2 / =404; } не подходит немного. Только непосредственно в /admin/ файлы получает. $1 - путь, $2 - содержит название каталога. Как ограничить /(.*)/, чтоб туда только до слеша попадала информация?
Для всех несуществующих файлов кроме ".php", вместо "{dir}/{path_to_file}", искать файлы в "admin/{path_to_file}"? {dir} - любая директория Т.е. /include/alfpha/style.css если не существуют, смотрим в /admin/alfpha/style.css /link2/alfpha/style.css = в /admin/alfpha/style.css /link3/img/img.png = в /admin/img/img.png /abrakadabra/img/img.png = в /abrakadabra/img/img.png ну и т.д.