Назад | Перейти на главную страницу

Nginx обрабатывает старые URL-адреса PHP как файлы

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

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

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