Очень сложно понять это. Я изменил свой веб-сайт с другой платформы на Joomla, и теперь Nginx не может обрабатывать старые URL-адреса.
Мои старые URL-адреса были такими:
example.com/home.php
example.com/contact-us.php
Мои новые URL-адреса SEF для Joomla выглядят так:
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;
}
Это действительно так? Может ли это вызвать проблемы с бесконечным циклом в некоторых случаях? Это правильный способ сделать это? Я не нашел подобного решения. Кто-нибудь может мне помочь?
location /
никогда не используетсяВаша проблема связана с приоритет местоположения (курсив наш).
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, таким как /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-файлов, которые не существуют.
Обратите внимание, что приведенная выше настройка также в документации.