Nginx рассматривает старые PHP-URL как файлы
Имея очень трудно понять это. Я изменил свой сайт с другой платформы на Joomla, и теперь Nginx не может обрабатывать старые URL-адреса.
Мои Старые URL были такими:
example.com/home.php
example.com/contact-us.php
Мои новые URL-адреса Joomla SEF выглядят так:
example.com/home
example.com/contact-us
У меня есть следующий конфиг Nginx в соответствии с руководством Joomla:
location / {
try_files $uri $uri/ /index.php?$args;
}
# Process PHP
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Я хочу, чтобы Nginx передал эти старые URL Joomla, чтобы справиться с этим. Теперь, что происходит, Nginx обрабатывает эти старые URL-адреса как файлы php, а затем показывает мне это No input file specified.
ошибка. Затем я изменил try_files внутри блока php на try_files $uri /index.php?$args;
поэтому мой конфиг Nginx выглядит так:
location / {
try_files $uri $uri/ /index.php?$args;
}
# Process PHP
location ~ \.php$ {
try_files $uri /index.php?$args;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Это действительно? Может ли это вызвать проблемы с бесконечным циклом в некоторых случаях? Это правильный способ сделать это? Я не нашел никакого решения, похожего на это. Может кто-нибудь направить меня, пожалуйста?
1 ответ
location /
никогда не используется
Ваша проблема связана с приоритетом местоположения (выделение добавлено).
Сначала nginx ищет наиболее конкретное местоположение префикса, заданное литеральными строками, независимо от указанного порядка. [...] Затем nginx проверяет местоположения, заданные регулярным выражением в порядке, указанном в файле конфигурации. Первое совпадающее выражение останавливает поиск, и nginx будет использовать это местоположение. Если никакое регулярное выражение не соответствует запросу, тогда nginx использует наиболее конкретное местоположение префикса, найденное ранее.
Таким образом, этот блок местоположения:
location ~ \.php$ {
try_files $uri =404; # <-
Соответствует этому запросу:
example.com/home.php
и никакой другой блок местоположения не имеет значения.
Как вы уже поняли, это означает, что nginx будет пытаться найти и обслужить home.php
в результате 404.
Используйте @location для основного файла index.php
Обычно единственный PHP-файл имеет отношение index.php
Вы можете использовать его следующим образом:
try_files $uri $uri/ @joomla;
location @joomla {
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param SCRIPT_NAME $document_root/index.php;
fastcgi_param DOCUMENT_URI /index.php;
fastcgi_index index.php;
}
Используйте другой блок местоположения для запросов *.php
В дополнение к фронт-контроллеру, joomla разрешает / ожидает прямого доступа к другим php-файлам, таким как /administrator/index.php
, Чтобы разрешить доступ к ним, не пытаясь обработать отсутствующие файлы php:
location ~ \.php$ {
try_files $uri @joomla;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Это позволит прямой доступ к другим файлам php (что, как правило, не очень хорошо...), возвращаясь к использованию /index.php
через @joomla
location, для любых запросов php-файлов, которые не существуют.
Обратите внимание, что вышеуказанная настройка также есть в документации.