4

我有一个基于 Perl 的网站,它试图在用户第一次访问时设置一些 cookie,我只是注意到 Safari 已经停止设置除了传递的第一个 cookie 之外的所有内容。首次访问时,应设置两个 cookie,即“位置”和“推荐人”。在 IE 和 Firefox 中,cookie 设置正确,但 Safari 仅设置“位置”cookie。我尝试更改名称、值等,我得出的结论是 Safari 只是设置了两个 cookie 中的第一个:

这是设置 cookie 的代码:

# Add location cookie if necessary
if(!$query->cookie('location') && $user_location) {
    my $cookie = $query->cookie(-name=>'location',-value=>qq|$user_lcoation|,-domain=>".domain.com",-path=>'/',-expires=>'+1Y');
    push(@cookies,$cookie);
}

# Add referrer if first visit
if(!$query->cookie('referrer')) {
    if($ENV{'HTTP_REFERER'}) {
        my $cookie = $query->cookie(-name=>'referrer',-value=>$ENV{'HTTP_REFERER'},-domain=>".domain.com",-path=>'/',-expires=>'+3M');
        push(@cookies,$cookie);
    }
    else {
        my $cookie = $query->cookie(-name=>'referrer',-value=>'unknown',-domain=>".domain.com",-path=>'/',-expires=>'+3M');
        push(@cookies,$cookie);
    }
}

if(scalar(@cookies)) {
    print $query->header(-cookie=>\@cookies);
}

这是我尝试从 curl 访问网站时得到的结果:

curl -so /dev/null -D - http://domain.com

HTTP/1.1 200 OK
Date: Thu, 18 Feb 2010 20:19:17 GMT
Server: Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.2.8 mod_perl/2.0.4 Perl/v5.8.8
Set-Cookie: location=Dallas; domain=.domain.com; path=/; expires=+1Y
Set-Cookie: referrer=unknown; domain=.domain.com; path=/; expires=Wed, 19-May-2010 20:19:20 GMT
Transfer-Encoding: chunked
Content-Type: text/html; charset=ISO-8859-1

有任何想法吗?我不知道我能做些什么来帮助解决这个问题,因为我的脚本似乎正确地传递了它们。提前感谢您提供的任何见解或想法!

4

3 回答 3

5

查看expires第一个 cookie 标头上的日期——它是一个文字+1Y,而不是它应该是的实际标准日期戳。我的猜测是您的 Safari 版本对此感到窒息,只是拒绝解析剩余的 cookie 标头。

要设置一年到期日期,正确的语法是-expires => '+1y'(小写 Y)。

于 2010-02-18T20:57:58.393 回答
0

尝试升级 CGI.pm (do cpan CGI)。我对通过 CGI.pm upgrade 解决的 cookie 有类似的问题。

于 2010-02-18T21:10:41.640 回答
0

回答有点晚,但迟到总比没有好:一种简单的方法,无需重新安装/更新 CGI.pm,使用 DateTime.pm 指定您希望 cookie 过期的日期:


my $cookie = CGI->new->cookie(
    -name=>'cookie_name',
    -value=>'value',
    -domain=>$ENV{'HTTP_HOST'},
    -expires=>((DateTime->now->set_time_zone('local'))->add(months=>1)->strftime("%a, %d %b %Y %I:%M:%S GMT")),
    -path=>'/',
);

我有一个可以保存 1 个月的 cookie。我在XP下的safari上测试过,效果很好。希望这会有所帮助

于 2010-07-26T10:40:52.270 回答