Редирект 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