nginx не будет выполнять код PHP при перенаправлении из URL-адреса типа SEO

В отличие от других вопросов, связанных с тем, что 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, и я не знаю, с чего начать отладку.

0
задан 21 June 2017 в 15:40
3 ответа

В вашем решении SEO используется нерекомендуемая директива if внутри местоположения . If Is Evil :

Директива , если имеет проблемы при использовании в контексте location , в некоторых случаях он делает не то, что вы ожидаете, а что-то совершенно другое вместо. В некоторых случаях это даже выходит из строя. Это вообще хорошая идея чтобы избежать этого, если возможно.

Правильный способ добиться того, что, я думаю, вы хотите, - это try_files , например:

location / {
    try_files $uri $uri/ @missing;
}

location @missing {
    rewrite ^(.*)$ /index.php break;
}
0
ответ дан 4 December 2019 в 16:13

Правильный способ реализации паттерна фронт-контроллера в 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;
}
1
ответ дан 4 December 2019 в 16:13

в server location put

error_page 404 =200 /index.php;

для перенаправления всех 404 (не найденных) страниц на ваш index.php

Вам не нужны все перезаписи и расположение, если вы просто хотите перехватить все отсутствующие страницы.

0
ответ дан 4 December 2019 в 16:13

Теги

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