Приключилась такая беда.
Дан конфиг nginx
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
location ~ (jpg|gif|png|css|js|jpeg|swf|doc)$ {
root /home/www/$host;
}
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT /home/www/$host;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_pass_header Status;
fastcgi_intercept_errors off;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
}
Дан код
#!/usr/bin/perl
use FCGI;
my $socket = FCGI::OpenSocket(":9000",5);
my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket);
while ($request->Accept() >= 0){
print "HTTP/1.1 302 Moved Temporarily\r\n";
print "Location: http://yandex.ru\r\n\r\n";
}
Всё это вместе отдаёт браузеру вот такой заголовок
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Fri, 22 Oct 2010 10:02:40 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Location: http://yandex.ru
Хотя должен 302-й с редиректом. В официальной документации есть
syntax: fastcgi_pass_header имя
context: http, server, location
Директива разрешает передавать клиенту запрещённые для передачи строки.
И этот момент я в конфиге учел, но всё равно статус отдаётся браузеру 200-й.
Как запретить nginx перехватывать 300-е и 400-е коды ответа от fast-cgi-приложения?