然后在Perl CGI下重定向工作,而不是MOD_PERL



我在设置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: $cookien";
print $cgi->redirect(-uri => 'http://example.com/cgi-bin/joe.cgi', -status => 303);

当我在常规CGI下用卷曲测试时,我会得到(域名更换并为简洁起见):

< 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决定以如此奇怪的方式处理此重定向?

iirc在CGI中解释到mod_perl porting。mod_perl编码指南

基本上,如果您使用$cgi->redirect( -cookie => $cookie, ... ),它将按照您的期望工作混合$cgi->header并打印" header n"倾向于在mod_perl下可靠地工作,选择一个或另一个

实际上为我使用的一切都在使用:

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

...用于我的饼干处理。如果您稍后决定重定向,这可以确保Cookie可以正常工作。

我试图避免用mod_perl污染我的纯CGI脚本,以便我可以来回切换,但会妥协。所有其他标头处理现在正常工作。

相关内容

  • 没有找到相关文章

最新更新