我有一些Perl CGI代码,我试图在SourceForge帐户的项目Web空间中运行。在与IE交谈时,代码能够设置浏览器cookie,但在与Firefox通信时,cookie设置为 而不是 。当我在“localhost”上使用Apache进行测试时,两个浏览器都能正常工作。它只在Firefox发布的远程SourceForge URL上。
搜索已经发现了数十个近 - 重复的问题,但通常人们会遇到完全相反的问题! (Firefox很好,IE有问题)
这是我打电话来设置cookie的实用程序:
sub setCookie {
my $name = shift;
my $value = shift;
my $expires = shift;
my $path = shift;
my $domain = shift;
if( !defined( $expires ) ) {
$expires = '+4h';
}
if( !defined( $path ) ) {
$path = '/';
}
if( !defined( $domain ) ) {
$domain = 'steveperkins.sourceforge.net';
}
my $cookie = CGI::cookie(
-name => $name,
-value => $value,
-domain => $domain,
-expies => $expires,
-path => $path
);
$r->header_out('Set-cookie' => $cookie);
}
有什么想法吗?我的第一个想法是某种子域问题,因为我的SourceForge项目URL中有一个子域,而“localhost”没有。我已经尝试将cookie域设置为我的特定子域,或者只是基础“sourceforge.net”。它似乎没有任何区别。
更新:以下评论中有人询问了HTTP响应标头。我使用网络流量分析工具Wireshark来监控IE和Firefox的请求和响应标头,这就是它们的样子:
GET http://myproject.sourceforge.net/cgi-bin/myscript.cgi?page=user&userID=1 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: http://myproject.sourceforge.net/cgi-bin/myscript.cgi
Accept-Language: en-us
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.30729; InfoPath.1; .NET CLR 3.0.30618)
Proxy-Connection: Keep-Alive
Host: myproject.sourceforge.net
Authorization: Basic [password omitted]
HTTP/1.1 200 OK
Server: nginx/0.7.63
Date: Tue, 26 Oct 2010 18:23:49 GMT
Content-Type: text/html; charset=ISO-8859-1
Expires: Thu, 28 Oct 2010 18:23:49 GMT
Cache-Control: max-age=172800, proxy-revalidate
Transfer-Encoding: chunked
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Content-Encoding: gzip
Set-Cookie: USER=1; domain=myproject.sourceforge.net; path=/
GET http://myproject.sourceforge.net/cgi-bin/myscript.cgi HTTP/1.1
Host: myproject.sourceforge.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Proxy-Connection: keep-alive
Cookie: __utma=191645736.1501259260.1287701281.1288028150.1288100562.10; __utmz=191645736.1288101011.10.10.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=sourceforge%20project%20web%20space%20basic%20auth; _jsuid=4215309712123065236
Authorization: Basic [password omitted]
HTTP/1.1 200 OK
Server: nginx/0.7.63
Date: Tue, 26 Oct 2010 18:17:58 GMT
Content-Type: text/html; charset=ISO-8859-1
Expires: Thu, 28 Oct 2010 18:17:58 GMT
Cache-Control: max-age=172800, proxy-revalidate
Transfer-Encoding: chunked
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Content-Encoding: gzip
Age: 0
答案 0 :(得分:5)
我会说您在设置过期时遇到了错误
if( !defined( $path ) ) {
$expires = '/';
}
应该是
if( !defined( $path ) ) {
$path = '/';
}
更新:根据您在上面使用wireshark提供的信息,我会检查当Firefox进入时是否实际调用了setCookie。(这两个URL都是不同的btw,它可能表示逻辑在您的代码中,根据URL跳过setCookie调用。同时尝试在两个浏览器中使用相同的URL,看看会发生什么。
答案 1 :(得分:2)
哎呀!事实证明,问题是在“localhost”上运行时只有一个cookie在运行,但是当在SourceForge的服务器上托管时,有多个cookie正在运行。
如果您查看上面问题中粘贴的Firefox请求标头,您会注意到有几个cookie名称 - 值对...每个对用分号分隔。 我的代码没有考虑到这个,所以它看到的只是一个巨大的错误形成的cookie。
我仍然不能100%确定它为什么在IE中部分工作,我将来可能会重新审视这一点,看看能否学到更多东西。但它现在基本上没有实际意义。我修改了代码以分号分隔,然后拆分为等号,我现在正在处理cookie。
感谢大家的见解和建议!皮埃尔 - 吕克,我确实对你的答案提出了一个赞成,感谢所有评论。
sub getCookie {
my $cookieName = shift;
my %headers = $r->headers_in;
my @keys = keys( %headers );
foreach my $name ( @keys ) {
if( $name eq 'Cookie') {
my @semicolontokens = split( ';', $headers{$name} );
foreach my $splitname ( @semicolontokens ) {
$splitname =~ s/^\s+//;
$splitname =~ s/\s+$//;
my @pair = split( '=', $splitname );
if( $pair[0] eq $cookieName ) {
return $pair[1];
}
}
}
}