Re: nginx->fast-cgi->php->bitrix -- как вернуть 404 из php , с ЧПУ тоже на 404

Igor Sysoev igor на sysoev.ru
Пн Фев 14 10:44:44 MSK 2011


On Sat, Feb 12, 2011 at 11:26:08PM +0200, Roman wrote:
> Здравствуйте, Nginx-ru.
> 
> nginx/0.8.54
> php 5.3.5 FPM/FastCGI
> 
> Друзья, никак немогу понять как передавать из скрипта php статус 404,
> при ЧПУ сделаном тоже на 404.
> 
> 
> 
> 
> Сайт работает на Битрикс.
> 
> ЧПУ сделано через /404.php
> 
> URL бывают
> - прямой вызов скрипта php              (/path/script.php)
> - c ЧПУ, редирект на реальный скрипт
> - если заканчивается на /path/          - вызов /path/index.php
> 
> с приведенным конфигом все работает нормально,
> кроме ситуации, когда URL с ЧПУ указывает на
> несуществующий путь, о чем известно только со стороны php
> 
> например:
> url  /news/102
> рерайтится в /news.php?id=102
> 
> и эта статья удалена. Без fast-cgi все работало - правильно.
> открывался /404.php и возвращался HTTP request status: 404
> а сейчас - открывался /404.php  но статус - всегда 200
> 
> 
> Да, в php:
> cgi.rfc2616_headers = 1;
> cgi.nph = 0;
> 
> 
> 
> конфиг:
> 
>         location / {
> 
> 
>                 index   index.php;
> 
>                 error_page      404 = @bitrix;
>                 error_page      502 /502.htm;
> 
> 
> 
>                 fastcgi_pass    unix:/tmp/php-fpm.sock;
>                 fastcgi_index   index.php;
>                 fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
>                 include fastcgi_params;
>                 fastcgi_intercept_errors on;

Убрать fastcgi_intercept_errors.

>                 #recursive_error_pages          on;
>                 #fastcgi_pass_header    Status;
>                 break;
>         }
> 
> 
> 
>         location @bitrix {
> 
>                 fastcgi_pass   unix:/tmp/php-fpm.sock;
> 
>                 fastcgi_index  index.php;
> 
>                 fastcgi_param  SCRIPT_FILENAME $document_root/404.php;
> 
>                 include fastcgi_params;
> 
>                 fastcgi_intercept_errors off;
> 
>                 fastcgi_pass_header     Status;
>                 #recursive_error_pages  on;
> 
>                 break;
> 
>         }

break не нужен. Совсем.
Вообще же, если конфигурация именно такая простая, то достаточно только

         location / {
                 index   index.php;
                 error_page      502 504 /502.htm;

                 fastcgi_pass    unix:/tmp/php-fpm.sock;
                 fastcgi_index   index.php;
                 fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                 include fastcgi_params;
         }

         location = /502.htm {
                ...
         }


-- 
Igor Sysoev
http://sysoev.ru/en/



Подробная информация о списке рассылки nginx-ru