Редирект HTTP заголовком "Location" 2

Maxim Dounin mdounin at mdounin.ru
Tue Jul 22 02:07:04 MSD 2008


Hello!

On Tue, Jul 22, 2008 at 12:42:12AM +0400, Alexey Kalinnikov wrote:

>  Не так давно (по весне) было уже обсуждение темы о редиректе при
>  заголовке "Location". Хотяелось бы еще раз поднять ее.
>
>  Проблема в том, что если необходим редирект (в моем случае
>  происходит выполнение fcgi perl) то помимо указания Location
>  необходимо обязательно указывать "302 Found", в противном случае
>  nginx ставит статус 200. Apache, lighttpd и другие сервера ставят
>  302 и все отрабатывается "правильно".
>
>  Достаточно четко проблема прописана как в той теме (Редирект HTTP
>  заголовком "Location") так и к примеру в
>  http://www.zag.ru/page/item_view/tarakan_tarakan_tarakashechka_zhidkonogaja_kozjavochka_bukashechka.html
>
>  Внимательное изучение RFC 1945 ничего не дало. а гугление выдало
>  следующую сентенцию

Курить надо не RFC1945, а спеки FastCGI.  Спеки FastCGI говорят, 
что:

% 6.2 Responder 
% A Responder FastCGI application has the same purpose as a CGI/1.1 
% program: It receives all the information associated with an HTTP 
% request and generates an HTTP response. 
...
% The Responder application sends CGI/1.1 stdout data to the Web 
% server over FCGI_STDOUT, and CGI/1.1 stderr data over FCGI_STDERR. 

Т.е. по формату самого ответа нас отсылают к CGI/1.1. Идём курить 
спеки CGI/1.1 и находим там:

http://hoohoo.ncsa.uiuc.edu/cgi/out.html

% Parsed headers
% The output of scripts begins with a small header. This header 
% consists of text lines, in the same format as an HTTP header, 
% terminated by a blank line (a line with only a linefeed or CR/LF). 
% Any headers which are not server directives are sent directly back 
% to the client. Currently, this specification defines three server 
% directives:
% 
% Content-type 
% This is the MIME type of the document you are returning. 
% 
% Location 
% This is used to specify to the server that you are returning a 
% reference to a document rather than an actual document. 
% 
% If the argument to this is a URL, the server will issue a redirect 
% to the client. 

А в RFC3875 (который ни разу не стандарт, но суть более формальное 
описание CGI/1.1) так вообще чёрным по белому что должен быть 302:

% 2.3.  Client Redirect Response
% 
%    The CGI script can return an absolute URI path in a Location header
%    field, to indicate to the client that it should reprocess the request
%    using the URI specified.
% 
%       client-redir-response = client-Location *extension-field NL
% 
%    The script MUST not provide any other header fields, except for
%    server-defined CGI extension fields.  For an HTTP client request, the
%    server MUST generate a 302 'Found' HTTP response message.

Такая вот многоходовка получается, по которой вообще говоря надо 
возвращать 302 если fastcgi-скрипт вернул заголовок Location.

>  "The HTTP status code changes the way browsers and robots handle
>  redirects, so if you are using header(Location:) it's a good idea
>  to set the status code at the same time. Browsers typically
>  re-request a 307 page every time, cache a 302 page for the session,
>  and cache a 301 page for longer, or even indefinitely.
>  Search engines typically transfer "page rank" to the new location for 301 redirects,
>  but not for 302, 303 or 307.
>
>  If the status code is not specified, header('Location:') defaults to 302."
>
>
>  Нельзя ли в и в nginx добавить данный функционал (возврат кода 302
>  вместо 200 если в хедере есть указание Location)? Или может быть кто
>  то может подсказать как реализовать его "на стороне веб-сервера"?

В ngx_http_fastcgi_module это легко запихивается.  Если я 
сподоблюсь построить тестовую среду для FastCGI - сделаю патч.

Maxim Dounin






More information about the nginx-ru mailing list