Cookie を設定してから mod_perl にリダイレクトする際に面白い問題が発生しました。私はこれまで通常の cgi 環境を使用してきましたが、Cookie/リダイレクトの設定が問題になったことはありません。すべてが期待どおりに機能しました。ただし、mod_perl をオンにすると、ステータス 200 が表示され、リダイレクト URL を含む HTML 本文が送信されます。リダイレクトの前に印刷しているにもかかわらず、Cookie は常にヘッダーの後、ドキュメント本文の前に配置されます。私が言いたいことがわかるように、スクリプトを必要最小限に切り詰めました。
#!/usr/local/bin/perl
use strict;
use warnings;
use CGI;
my $cgi = new CGI;
my $cookie = CGI::cookie(
'-name' => 'joe',
'-value' => 'fred',
'-path' => '/cgi-bin',
'-httponly' => 1,
);
print "Set-Cookie: $cookie\n";
print $cgi->redirect(-uri => 'http://example.com/cgi-bin/joe.cgi', -status => 303);
通常の CGI で curl を使用してこれをテストすると、次のようになります (簡潔にするためにドメイン名を置き換えて省略しています)。
< HTTP/1.1 303 See Other
< Date: Tue, 23 Oct 2012 16:26:55 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Set-Cookie: joe=fred; path=/cgi-bin; HttpOnly
< Location: http://example.com/cgi-bin/joe.cgi
< Content-Length: 0
...これは私が期待するものです。これを mod_perl でテストすると、次のようになります。
< HTTP/1.1 200 OK
< Date: Tue, 23 Oct 2012 16:26:38 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Location: http://example.com/cgi-bin/joe.cgi
< Transfer-Encoding: chunked
<
Set-Cookie: joe=fred; path=/cgi-bin; HttpOnly
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>200 OK</title>
</head><body>
<h1>OK</h1>
<p>The answer to your request is located <a href="http://example.com/cgi-bin/joe.cgi">here</a>.</p>
<hr>
<address>Apache/2.2.22 (Ubuntu) Server at example.com Port 80</address>
</body></html>
ログに警告が表示されません。mod_perl がこのような奇妙な方法でこのリダイレクトを処理することを決定した理由は何ですか?