При пристальном рассмотрении моей проблемы редиректа оказалось, что 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 );
    }

Итог

Поделом великану досталося, И усов от него не осталося.