为什么Perl的CGI :: cookie能够在IE中设置cookie,而不是Firefox
发布时间:2020-12-16 06:27:17 所属栏目:大数据 来源:网络整理
导读:我有一些Perl CGI代码,我试图在SourceForge帐户的项目Web空间中运行.在与IE交谈时,代码能够很好地设置浏览器cookie,但在与Firefox交谈时没有设置cookie.当我在“localhost”上使用Apache进行测试时,两个浏览器都能正常工作.它只在Firefox疯狂的远程SourceFor
我有一些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的请求和响应标头,这是它们的样子: IE(作品) 请求 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=/ Firefox(不起作用) 请求 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 解决方法
我会说你在设置过期时遇到了一个错误
if( !defined( $path ) ) { $expires = '/'; } 应该 if( !defined( $path ) ) { $path = '/'; } 更新:根据您在上面使用wireshark提供的信息,我会检查当Firefox进入时是否实际调用了setCookie.(两个URL都是不同的btw,它可能表示代码中的逻辑跳过了基于的setCookie调用URL).还尝试在两个浏览器中使用相同的URL,看看会发生什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |