Наличие очень твердого к попытке понять это. Я изменил свой веб-сайт от другой платформы до 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;
}
Действительно ли это допустимо? Это вызвало бы бесконечный цикл проблемы в некоторых случаях? Это, правильный способ сделать это? Я didint нахожу любое решение подобным этому. Кто-то может вести меня?
location /
никогда не используетсяПроблема, которую вы имеете, связана с location precedence (курсив добавлен).
nginx сначала ищет наиболее конкретный префикс местоположения, заданный буквенными строками, вне зависимости от перечисленного порядка. [...] Затем nginx проверяет места, заданные регулярным выражением в порядке, указанном в конфигурационном файле. Первое совпадающее выражение останавливает поиск и nginx будет использовать эту локацию. Если ни одно регулярное выражение не совпадает с запросом, то nginx использует самую специфичную локацию префикса, найденную ранее.
Как таковой, этот блок локации:
location ~ \.php$ {
try_files $uri =404; # <-
Соответствует этому запросу:
example.com/home.php
и ни один другой блок локации не является релевантным.
Как вы уже поняли, это означает, что nginx будет пытаться найти и обслуживать home.php
, в результате чего получится 404.
Обычно единственным релевантным 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;
}
В дополнение к фронт-контроллеру, joomla разрешает/ожидает прямой доступ к другим php файлам, таким как /администратор/индекс.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
, для любых запросов php-файлов, которые не существуют.
Обратите внимание, что вышеуказанная настройка также находится в документации .
.