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

Alexey Kalinnikov alexej at tenneta.ru
Tue Jul 22 03:55:03 MSD 2008


Hello Maxim,

Tuesday, July 22, 2008, 3:04:11 AM, you wrote:

> Hello!

> On Tue, Jul 22, 2008 at 02:07:04AM +0400, Maxim Dounin wrote:

>> 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

Спасибо большое! Работает.

-- 
Best regards,
 Alexey







More information about the nginx-ru mailing list