Почему Safari не устанавливает куки из моего скрипта Perl CGI? - PullRequest
4 голосов
/ 18 февраля 2010

У меня есть веб-сайт на Perl, который пытается установить количество файлов cookie при первом посещении пользователя, и я только что заметил, что Safari прекратил устанавливать все файлы, кроме первого, который передается. При первом посещении должны быть установлены два файла cookie: «location» и «referrer». В IE и Firefox файлы cookie устанавливаются правильно, но Safari только устанавливает файл cookie «location». Я попытался изменить имена, значения и т. Д., И пришел к выводу, что Safari просто устанавливает первый из двух файлов 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:

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

Есть идеи? Я в растерянности относительно того, что я могу сделать, чтобы помочь решить эту проблему, так как кажется, что мой скрипт передает их правильно. Заранее благодарим за любые идеи и идеи, которые у вас могут быть!

Ответы [ 3 ]

5 голосов
/ 18 февраля 2010

Посмотрите на дату expires в первом заголовке файла cookie - это литерал +1Y вместо фактической стандартной метки даты, которой она должна быть.Я предполагаю, что ваша версия Safari задыхается от этого и просто отказывается анализировать оставшиеся заголовки файлов cookie.

Чтобы установить дату истечения одного года, правильный синтаксис - -expires => '+1y' (строчная Y).

0 голосов
/ 26 июля 2010

немного поздно для 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, отлично работает.надеюсь, это поможет

0 голосов
/ 19 февраля 2010

Попробуйте обновить CGI.pm (сделайте cpan CGI). У меня была похожая проблема с файлами cookie, которая была решена обновлением CGI.pm.

...