В отличие от других вопросов, связанных с тем, что nginx не выполняет файлы PHP, мой выполняет, проблема возникает, когда я использую SEO как URL-адреса вместо этого и перенаправляю на php-скрипт, а затем вместо выполнения кода он отправляет скрипт в виде простого текста в браузер.
В основном я хочу, чтобы каждый запрос отправлялся на HTTP-сервер для которых нет фактического файла, будет выполнен скрипт index.php, и его результат будет возвращен браузеру. Но происходит то, что вместо этого я получаю код внутри index.php.
Это раздел моего файла конфигурации, где выполняется перенаправление. Фактически он был переведен из бывшего файла Apache .htaccess:
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php break;
}
}
Это директивы, связанные с PHP, на самом деле они предшествуют предыдущей в файле конфигурации:
location ~ \.php$ {
try_files /dd05cf208ebd3d4559f3af75016a1e3d.htm @php;
}
location @php {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php7.0-fpm/web4.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
Я использую Apache с mod_php в течение десятилетий и эквивалентные директивы просто работали из коробки, но я m new с Nginx, и я не знаю, с чего начать отладку.
В вашем решении SEO используется нерекомендуемая директива if
внутри местоположения
. If Is Evil :
Директива
, если
имеет проблемы при использовании в контекстеlocation
, в некоторых случаях он делает не то, что вы ожидаете, а что-то совершенно другое вместо. В некоторых случаях это даже выходит из строя. Это вообще хорошая идея чтобы избежать этого, если возможно.
Правильный способ добиться того, что, я думаю, вы хотите, - это try_files
, например:
location / {
try_files $uri $uri/ @missing;
}
location @missing {
rewrite ^(.*)$ /index.php break;
}
Правильный способ реализации паттерна фронт-контроллера в nginx следующий:
location / {
try_files $uri $uri/ /index.php;
}
Ваши блоки местоположения PHP выглядят немного странно. Я предполагаю, что ваша цель с конфигурацией - позволить nginx отображать уведомление об обслуживании в /dd05cf208ebd3d4559f3af75016a1e3d.htm
, если файл существует.
Эта конфигурация мне кажется правильной, за исключением того, что try_files
внутри вашего блока @php
приводит к сбою запросов, поскольку он заставляет nginx искать файлы с именами, указанными в URI, и с дружественными URL-адресами, эти файлы просто не существуют.
Нет причин чтобы включить это, ваша конфигурация PHP должна выглядеть следующим образом.
location ~ \.php$ {
try_files /dd05cf208ebd3d4559f3af75016a1e3d.htm @php;
}
location @php {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php7.0-fpm/web4.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
в server location put
error_page 404 =200 /index.php;
для перенаправления всех 404 (не найденных) страниц на ваш index.php
Вам не нужны все перезаписи и расположение, если вы просто хотите перехватить все отсутствующие страницы.