代码之家  ›  专栏  ›  技术社区  ›  Steve Perkins

为什么Perl的cgi::cookie能够在IE中设置cookie,而不是在Firefox中设置cookie?

  •  5
  • Steve Perkins  · 技术社区  · 15 年前

    我有一些PerlCGI代码,我正试图在一个sourceforge帐户的项目Web空间中运行这些代码。代码可以在与IE对话时设置浏览器cookie,但cookie是 与Firefox通话时设置。当我在“localhost”上测试Apache时,两种浏览器都可以正常工作。只有在远程sourceforge的url上,firefox才会弹出。

    搜索结果显示 近的 -重复的问题,但通常人们有完全相反的问题!(火狐很好,有问题)

    这是我打电话来设置cookies的实用程序子程序:

    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和火狐的请求和响应头,它们看起来是这样的:

    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=/
    

    火狐(不工作)

    请求

    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
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Pierre-Luc Simard    15 年前

    我想说你的过期设置有问题

    if( !defined( $path ) ) {
        $expires = '/';
    }
    

    应该是

    if( !defined( $path ) ) {
        $path = '/';
    }
    

    更新时间: 根据您在上面使用wireshark提供的信息,我将检查当firefox出现时是否真的调用了setcookie。(两个URL都是不同的btw,这可能表示代码中的逻辑跳过了基于该URL的setcookie调用)。同时尝试在两个浏览器中使用相同的URL,看看会发生什么。

        2
  •  2
  •   Steve Perkins    15 年前

    啊!事实证明,在“localhost”上运行时,只有一个cookie在运行,但在sourceforge的服务器上运行时,有多个cookie在运行。

    如果你看看上面问题中剪切粘贴的火狐请求头,你会发现有几个cookie名称-值对…每对用分号分隔。 我的代码无法解释这个问题 所以它只看到一个巨大的不规则形状的饼干。

    我仍然不能百分之百地确定它为什么部分地在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];
                   }
               }
           }
       }