0

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 がこのような奇妙な方法でこのリダイレクトを処理することを決定した理由は何ですか?

4

2 に答える 2

1

IIRC は、CGI から mod_perl への移植で説明されています。mod_perl コーディング ガイドライン

$cgi->redirect( -cookie => $cookie, ... ) 基本的に、 Mixingを使用$cgi->headerし、"header\n" を印刷すると、mod_perl では確実に動作しない傾向があるため、期待どおりに動作します。どちらかを選択してください

于 2012-10-27T03:11:39.963 に答える
1

実際に私のためにすべてを修正したのは、次のものを使用していました:

my $r = Apache2::RequestUtil->request;
$r->err_headers_out->add('Set-Cookie' => $cookie);

...私のクッキー処理のために。これにより、後でリダイレクトする場合に Cookie が機能することが保証されます。

私は自分の純粋な CGI スクリプトを mod_perl で汚染するのを避けようとしていたので、前後に切り替えることができましたが、これで妥協しました。他のすべてのヘッダー処理は正常に機能するようになりました。

于 2012-10-31T13:49:25.293 に答える