LINUX.ORG.RU

Nginx + Perl-fastcgi


0

1

Приключилась такая беда.

Дан конфиг 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-приложения?

★☆☆

Повторил конфигурацию - все ОК.
Можно попробовать вместо

 HTTP/1.1 302 Moved Temporarily
отдавать
Status: 302 Moved Temporarily

m0use ()
Ответ на: комментарий от m0use

Все оказалось прозаичнее Server: nginx/0.6.32 не умеет этого. После обновления до 0.7.* всё заработало само.

r_asian ★☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.