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-файлов, которые не существуют.

Обратите внимание, что вышеуказанная настройка также есть в документации.

Другие вопросы по тегам