Re[2]: Редирект HTTP заголовком "Location" 2
Alexey Kalinnikov
alexej at tenneta.ru
Thu Jul 31 00:05:23 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 mailto:alexej at tenneta.ru
More information about the nginx-ru
mailing list