Nginx, рассматривающий старые URL PHP как Файлы

Наличие очень твердого к попытке понять это. Я изменил свой веб-сайт от другой платформы до 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 нахожу любое решение подобным этому. Кто-то может вести меня?

2
задан 9 January 2015 в 15:47
1 ответ

location / никогда не используется

Проблема, которую вы имеете, связана с location precedence (курсив добавлен).

nginx сначала ищет наиболее конкретный префикс местоположения, заданный буквенными строками, вне зависимости от перечисленного порядка. [...] Затем nginx проверяет места, заданные регулярным выражением в порядке, указанном в конфигурационном файле. Первое совпадающее выражение останавливает поиск и nginx будет использовать эту локацию. Если ни одно регулярное выражение не совпадает с запросом, то nginx использует самую специфичную локацию префикса, найденную ранее.

Как таковой, этот блок локации:

location ~ \.php$ {
    try_files $uri =404; # <-

Соответствует этому запросу:

example.com/home.php

и ни один другой блок локации не является релевантным.

Как вы уже поняли, это означает, что nginx будет пытаться найти и обслуживать home.php, в результате чего получится 404.

Используйте @локацию для главного файла 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 файлам, таким как /администратор/индекс.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-файлов, которые не существуют.

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

.
3
ответ дан 3 December 2019 в 10:44

Теги

Похожие вопросы