Таракан, таракан, таракашечка, жидконогая козявочка-букашечка...
При пристальном рассмотрении моей проблемы редиректа оказалось, что Apache и lighttpd проявляют зачатки интеллекта. При присутсвии в выводе HTTP заголовка Location FastCGI программы ( а также, наверняка, CGI ) самостоятельно добавляют код ответа "HTTP/1.1 302 Found". nginx поступает прямолинейно: отвечает "HTTP/1.1 200 OK".
Firefox следует ответу 200 OK
Я не стал проверять поведение остальных броузеров, но Firefox (и wget) при получении ответа "HTTP/1.1 200 OK" отображет пустую страницу, не взирая на заголовок Location:. Т.е. редиректа не делает.
Вот примеры ответов:
- lighttpd (редирект +)
HTTP/1.0 302 Found
Connection: keep-alive
Date: Wed, 02 Apr 2008 08:19:54 GMT
Location: http://pers.zag:81
Content-Type: text/html; charset=utf-8
Content-Length: 0
Server: lighttpd/1.4.18
- Apache (редирект +)
HTTP/1.1 302 Found
Date: Wed, 02 Apr 2008 08:19:44 GMT
Server: Apache/2.0.63 (FreeBSD) PHP/4.4.8 with Suhosin-Patch mod_fastcgi/2.4.6 mod_ssl/2.0.63 OpenSSL/0.9.8e
Location: http://pers.zag
Content-Length: 351
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
- nginx (редирект -)
HTTP/1.1 200 OK
Server: nginx/0.6.26
Content-Type: text/html; charset=utf-8
Connection: close
Date: Wed, 02 Apr 2008 08:19:59 GMT
Location: http://pers.zag:82
Предидущий код вывода для функции редиректа был:
sub redirect2url {
my ( $self, $redirect_url ) = @_;
$self->set_header( '-Location', $redirect_url );
}
Как видно nginx для такого случая, оставляет 200 OK: что сказали - получили. Поэтому, не надеясь на телепатические способности Web сервера, нужно давать "полный ответ":
sub redirect2url {
my ( $self, $redirect_url ) = @_;
$self->set_header( "-status", '302 Found' );
$self->set_header( '-Location', $redirect_url );
}
Итог
Поделом великану досталося, И усов от него не осталося.