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...
вот и грабли ....
Примечание: в большинстве случаев данный параметр выключен изначально ... но это не мой случай =)

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