【问题标题】:Set-Cookie then redirect working under perl CGI, but not mod_perlSet-Cookie 然后重定向在 perl CGI 下工作,但不是 mod_perl
【发布时间】:2012-10-13 16:18:31
【问题描述】:

我在设置 cookie 然后在 mod_perl 下重定向时遇到了一个有趣的问题。到目前为止,我有一个常规的 cgi 环境,设置 cookie/redirect 从来都不是问题;一切都按预期进行。然而,当我打开 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 决定以如此奇怪的方式处理这个重定向吗?

【问题讨论】:

  • mod_perl/2.0.5, Apache/2.2.22
  • 如何在 mod_perl 下运行它?您是使用 ModPerl::Registry 还是直接运行处理程序?
  • 你看过这个关于cookies/redirect的页面吗? perl.apache.org/docs/2.0/user/coding/… 根据您的实施方式显示多种 cookie/重定向方式。
  • @friedo,看起来像 ModPerl::Registry。这就是我在我的 apache 配置中所拥有的。抱歉,我才刚刚开始运行 mod_perl。
  • @mrk,我会用这个做一些测试,但我一直读到,在大多数情况下,你可以将你的 cgi 脚本放在 mod_perl 下,只要你不做任何事情,它们就可以工作太奇怪了。我想阻止脚本使用 mod_perl 特定的编码,至少有一段时间,所以我可以来回切换。

标签: perl cgi mod-perl2


【解决方案1】:

IIRC 在CGI to mod_perl Porting. mod_perl Coding guidelines 中解释过

基本上,如果您使用$cgi-&gt;redirect( -cookie =&gt; $cookie, ... ),它将按您的预期工作 混合 $cgi-&gt;header 和 print "header\n" 在 mod_perl 下往往不会可靠地工作,选择一个或另一个

【讨论】:

  • 谢谢,但由于我碰巧在重定向之前处理了任何 cookie,所以我必须进行一些花哨的重新设计以将 cookie 与重定向请求结合起来。对我来说,cookie 无论如何都与重定向无关。
【解决方案2】:

真正为我解决所有问题的是使用:

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

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

我试图避免用 mod_perl 污染我的纯 cgi 脚本,这样我就可以来回切换,但在这个问题上妥协了。现在所有其他标头处理工作正常。

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2014-10-03
    • 1970-01-01
    • 2011-08-25
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2021-03-20
    相关资源
    最近更新 更多