22 сент. 2011 г.

факир был пьян... статус 200 вместо 404 ...

Цель: Пропуская через сокет nginx'a, а в качестве такого выступает php-fpm, php-сценарий, не зависимо от того, что в сценарии есть:
header("HTTP/1.0 404 Not Found");
возвращается ответ с статусом 200 вместо 404, хотя статусов 301 и 302 это не касается ...
кто же режет 404 СТАТУС?! nginx? php-fpm? or php?

#cat /1.php
<?php
header("HTTP/1.0 404 Not Found");
?> 

#curl -i test.local/1.php
HTTP/1.1 200 OK
Server: nginx/1.0.6
Date: Thu, 22 Sep 2011 10:01:13 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.6


Дано: nginx/1.0.6, PHP 5.3.6


Решение: Добавление дополнительных строк к описанию хоста:
location ~ \.php$ {
...
fastcgi_pass_header Status;
...
}
к положительным результатам не привели, как оказалось в php есть фича:
; cgi.rfc2616_headers configuration option tells PHP what type of headers to
; use when sending HTTP response code. If it's set 0 PHP sends Status: header that
; is supported by Apache. When this option is set to 1 PHP will send
; RFC2616 compliant header.
; Default is zero.
; http://php.net/cgi.rfc2616-headers
cgi.rfc2616_headers = 0
при включенном cgi.rfc2616_headers (cgi.rfc2616_headers=1), действие вида:
header("HTTP/1.0 404 Not Found");
задает не валидный заголовок, в связи с этим заголовок nginx'у передается пустым, а nginx уже, при пустом заголовке дописывает его как заголовок со статусом 200... вот и грабли ....
Примечание: в большинстве случаев данный параметр выключен изначально ... но это не мой случай =)

Комментариев нет:

Отправить комментарий