2010-02-18 110 views
4

我有一个基于Perl的网站,它试图在用户第一次访问时设置一些cookie,我只注意到Safari已经停止设置除了传递的第一个cookie之外的所有cookie。在第一次访问时,应该设置两个“位置”和“引用者”。在IE和Firefox中,Cookies设置正确,但Safari只设置“位置”cookie。我试图改变名称,值等,并得出结论我来的是,Safari浏览器只是设置第一两个cookie:为什么Safari没有从我的Perl CGI脚本中设置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 -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 

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

+1

当你说“safari”时,你指的是什么版本? – NotMe 2010-02-18 20:50:40

+0

好问题。这在Mac上的Safari v4.0.4中发生。 – 2010-02-18 23:10:54

回答

5

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

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

+0

@friedo - 谁知道如此简单的事情可能会导致如此多的问题。只要我将两者都更改为小写,所有事情都会重新开始。感谢您的支持 - 您为我节省了数小时和数小时的故障排除工作! – 2010-02-18 23:08:38

0

尝试升级CGI.pm(做cpan CGI)。我有类似的问题,通过CGI.pm升级解决了Cookie。

0

有点晚了一个aswer,但后来总比没有好: 一个简单的方法,而无需重新安装/升级CGI.pm,是指定 希望您的Cookie到期日期,使用DateTime.pm:


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=>'/', 
); 
 

那里我有一个cookie将持续1个月。 我在XP下的safari上测试它,工作正常。 希望这会有所帮助

相关问题