4

ユーザーが最初にアクセスしたときに多数の Cookie を設定しようとする Perl ベースの Web サイトを持っていますが、Safari が最初に渡された Cookie 以外のすべての Cookie の設定を停止していることに気付きました。最初の訪問時に、「ロケーション」と「リファラー」の 2 つの Cookie を設定する必要があります。IE と Firefox では Cookie が正しく設定されていますが、Safari では「場所」Cookie のみが設定されています。名前や値などを変更してみましたが、結論として、Safari は 2 つの Cookie のうち最初の 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 から Web サイトにアクセスしようとすると、次のようになります。

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

最初のCookieヘッダーのexpires日付を確認し+1Yます。これは、実際の標準の日付スタンプではなく、リテラルです。私の推測では、あなたのバージョンのSafariはこれを窒息させており、残りのCookieヘッダーの解析を単に拒否していると思います。

1年の有効期限を設定するには、正しい構文は-expires => '+1y'(小文字のY)です。

于 2010-02-18T20:57:58.393 に答える
0

CGI.pmをアップグレードしてみてください(do cpan CGI)。CGI.pmのアップグレードによって解決された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 に答える