Forum Webscript.Ru

Программирование => Perl => Тема начата: Sergg от 19 Января 2004, 18:29:24

Название: Проблемка с Cookie
Отправлено: Sergg от 19 Января 2004, 18:29:24
Добрый день.

Есть небольшая проблемка: есть скрипт на perl который выводит определенную информацию в зависимости от двух параметров ID (индефикатор определенной информации) и FID (индификатор формата в котором нужно вывести эту информацию).
Например, http://имя_сайта.ru/cgi-bin/script.cgi?id=100011&fid=02 .
Результатом работы этого скрипта получаем информацию с id=100011 из базы и перекодированную по алгоритму с FID=02 (может меняться от 01 до 10).
Кроме всех этих преобразований скрипт заносит cookie на компьютер посетителя со значением fid (например, fid=02) используя следующие строки на perl:

print "Content-type: text/html\\n";
print "Set-Cookie: fid=02; path=/\\;  expires=Mon,31-DEC-2005 10:59:31 GMT\\n\\n";

Проблема заключается в следующем: мне нужно вставить результаты работы этого скрипта в страницу с определенным дизайном, я это делаю вставкой в shtml-файл следующей дерективы SSI и обращаюсь к shtml-файлу со всеми параметрами http://имя_сайта.ru/index.shtml?id=100011&fid=02, все что должно было вставиться и перекодироваться делается, но cookie не записываются, хотя если вызывать на прямую скрипт то все Ok.

Эта проблема в принципе решается вставкой следующего кода:
print "Content-type: text/html\\n\\n";
print "";
Но мне этот код не походит потому, что при следующем варианте перехода по страницам :

index.shtml?id=100011 --> index.shtml?id=100011&fid=02 --> index.shtml?id=100011&fid=05
     в cookie fid=00              в cookie fid=02               в cookie fid=05

а потом в обратном направлении (нажимая кнопку Назад броузера) - (смотреть справа-налево)

index.shtml?id=100011 <-- index.shtml?id=100011&fid=02 <-- index.shtml?id=100011&fid=05
     в cookie fid=00              в cookie fid=02               в cookie fid=05

я получаю cookie с fid=02, а должно быть fid=05, это потому что при движении обратно (нажимая кнопку Назад броузера) странице не кэшируются, а заново меняют значения cookie.
Но если бы я использовал самый первый код на perl и он нормально записывал cookie при вставке в shtml-файл, то все бы кешировалось при движении по ссылкам в обратном направлении - а мне так и нужно (нужно запомнить в cookie последнее значение fid при движении по ссылкам только вперед).

Поэтому нужно довести до ума первый код, так чтобы он нормально работал вставлясь в shtml-файл.

Кто все таки понял что я имел ввиду и знает как мне помочь, то помогите пожалуйста.
Название: Проблемка с Cookie
Отправлено: NeoNox от 19 Января 2004, 18:47:49
script.cgi покажи.
Название: Проблемка с Cookie
Отправлено: Sergg от 19 Января 2004, 19:03:18
Вот рабочая часть скрипта отвечающая за запись нужных мне cookie, весь скрипт нет смысла публиковать, потому что во время отладки не правильно работает эта часть скрипта (как отдельный скрипт)

#!/usr/bin/perl

$year = \'2050\';          
$default_format="01";

#Разделяем QUERY_STRING для последующего использования
$in=$ENV{QUERY_STRING};

@query=split /&/,$in;
if ($query[1] ne "") {@id_subcat=split /=/,$query[1];$id_p = $id_subcat[1];} else {$id_p=$default_format;}
# После выполнения условий нужные переменные хранятся в $id_c, $id_p

@query=null;
@id_cat=null;
@id_subcat=null;


$hum = $ENV{\'HTTP_COOKIE\'};
@hums = split(/\\;/, $hum);
foreach $extract (@hums) {if ($extract =~ /userphone=/) {$userphone = $extract;}}

if ($userphone eq "")
{
print "Content-type: text/html\\n";
print "Set-Cookie: userphone=$default_format; path=/;  expires=Mon,31-DEC-$year 10:59:31 GMT\\n\\n";
}
else
{
($gone1, $phone) = split(/=/, $userphone);
if ($phone ne $id_p) {
print "Content-type: text/html\\n";
print "Set-Cookie: userphone=$id_p; path=/;  expires=Mon,31-DEC-$year 10:59:31 GMT\\n\\n";
}
else {print "Content-type: text/html\\n\\n";}
}
Название: Проблемка с Cookie
Отправлено: NeoNox от 19 Января 2004, 20:30:09
Ты заголовки вставляеш как попало. Повнимательнее с ними.
Вот тебе рабочий пример:
test.cgi:

#!/usr/bin/perl
use CGI qw(:standard);

$id = param("id");
$val= param("val");

print "Set-Cookie: $id=$val; expires=Wed, 10-Feb-2077 00:00:00 GMT\\n";
print header();
print "Ok";


index.shtml:




Вызов: http://www.site.com/index.shtml?id=MyId&val=0003
Название: Проблемка с Cookie
Отправлено: Sergg от 19 Января 2004, 22:00:53
Скрипт рабочий, но там та же проблема - при вызове скрипта напрямую cookie записываются и все Ok, но если я вставляю его результат в shtml-файл, то cookie не создаются (тестировал на домашнем апаче и в интернете).

Можете сами попробовать:
http://www.prikol.net/cgi-bin/test.cgi?id=1000&val=04 - скрипт напрямую
http://www.prikol.net/temp/test.shtml?id=1000&val=04 - вставка через SSI

Так что дело в чем-то другом.

Можно конечно оставить и так, но посетителям придется просматреть больше страниц чтобы добраться до нужной информации, а так хоть я им облегчаю задачу в 2 раза.
Название: Проблемка с Cookie
Отправлено: NeoNox от 19 Января 2004, 22:08:38
Покажи мне конфиг апача если у тебя есть к нему доступ.
Название: Проблемка с Cookie
Отправлено: Sergg от 19 Января 2004, 22:11:36
Могу только конфиг апача который стоит у меня на компе, на когфиг у хостера нет доступа. Нужен конфиг домашнего моего арача (только там по cookie нет вроде не чего)?
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 09:02:08
Что так не кто и не знает в чем здесь может быть проблема?
Название: Проблемка с Cookie
Отправлено: Phoinix от 20 Января 2004, 09:59:27
Sergg

AFAIK Заголовки Location и Set-cookie - не работают если скрипт вставлен через SSI...

Как вариант, можно при установке куков, просто запускать отдельный скрипт устанавливать куки, а потом сразу редиректить обратно...
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 10:08:34
Это конечно вариант, но хочется как-то по человечески все сделать.
Название: Проблемка с Cookie
Отправлено: NeoNox от 20 Января 2004, 11:09:26
Sergg сколько раз тебе повторить про конфиг Апача?
Рабочая конфигурация:
httpd.conf:
AddType text/html .shtml .sht .shtml
AddHandler server-parsed  .shtml


......
   Options FollowSymlinks ExecCGI
   Options +Includes
......


perl, v5.8.0
Server version: Apache/1.3.20 (Unix)

Phoinix все работает. Я, как правило, проверяю то что пишу.
Название: Проблемка с Cookie
Отправлено: Phoinix от 20 Января 2004, 11:34:57
NeoNox

А я и не утверждаю :), я же говорю "насколько я знаю"

Настройка Apache:

...

...
    Options FollowSymLinks
    Options Indexes Includes
    Options +Includes
...

...
    AddType text/html .shtml .shtm
    AddHandler server-parsed .shtml .shtm
...

Perl 5.8.2
Server version: Apache/1.3.29 (Win32)

Так у меня не работает... :(, хотя скрипты я вставляю не ExecCGI, а Include Virtual...

Попробую как ты говоришь...
Название: Проблемка с Cookie
Отправлено: Phoinix от 20 Января 2004, 12:03:04
NeoNox

Иногда работа Perl скриптов несколько удивляет... надо книжки еще почитать...

При использовании Location выводит уже не ошибку, а ссылку на URL куда редиректил... Куки соответсвенно тоже не проставляются, и IMHO знаю почему (эта тема уже обсуждалась).

(Это не лекция, это рассуждение... ;))
Тег (заголовок) закрыт, началось тело страницы
скрипт уже вставляется в тело страницы, когда заголовок передан, соответственно, передача других заголовков скриптом не пройдет... Даже если его "инклюдить" в head страницы...

Либо я где-то неправ в настройках...
Название: Проблемка с Cookie
Отправлено: NeoNox от 20 Января 2004, 12:04:59
Кстати, как вариант вызов скрипта таким образом -
Название: Проблемка с Cookie
Отправлено: NeoNox от 20 Января 2004, 12:11:27
Phoinix
Вероятно это зависит от реализации броузера.
Это проверено на Мозилле, на ИЕ нет возможности проверить.
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 12:11:50
Настройка моего Apache:

...

  Options Indexes Includes
  AllowOverride All
  Allow from all

...
    AddType text/html .shtml .shtm
    AddHandler server-parsed .shtml .shtm
...

Perl 5.8.0.806
Server version: Apache 1.3.6 (Win32)

Пробовал с теми настройками как Вы говорили (NeoNox) и как говорил Phoinix, эффект нулевой - не устанавливает cookie при вставке через SSI. Тем более как я изменю конфиг у хостера (masterhost.ru), если только через .htaccess.

На счет последнего варианта надо попробовать, я тут подумал раз он не правильно работает когда вставляется через SSI, то просто вызывать весь скрипт так http://www.site.ru/papka/?id=MyId&val=0003 , а в папку бросить .htaccess с вызовом скрипта из cgi-bin, только в сам скрипт предется дизайн вписывать.
Название: Проблемка с Cookie
Отправлено: Phoinix от 20 Января 2004, 12:14:02
NeoNox

:) Интересно, но заработало, правда в таком случае отпадает надобность использования SSI... Жаль что редирект при этом не срабатывает... но это совершенно другая история...
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 12:39:58
Вариант с img у меня тоже работает (по крайней мере на IE), только что-то не могу найти файлы cookie от NN (в папке с NN есть файл cookie.txt но туда что не чего не пишется).
Название: Проблемка с Cookie
Отправлено: Phoinix от 20 Января 2004, 14:23:06
Sergg

Ну не знаю... по крайней мере в Mozilla 1.5. - работает...

NeoNox

IMHO все-таки зависит от платформы... т.к. Mozilla 1.5 дает тот же результат что и IE
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 15:18:19
Записаваться сейчас cookie записываются (используя img), а вот с их чтением при вставке скрипта через SSI таже проблема (при запуске самого скрипта cookie читаются и обрабатываются, а при запуске через SSI не чего не читается).
Я раньше как-то не думал, что при использовании SSI могут быть такие проблемы (А я и не знал, что любовь может быть так жестока :)).
Название: Проблемка с Cookie
Отправлено: Phoinix от 20 Января 2004, 15:55:56
Sergg
Вот со чтением через SSI никогда у меня проблем не было... а код какой?

my $envname="HTTP_COOKIE";
my $cook=$ENV{$envname};
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 16:02:52
Код в самом начале топика был написан:

$hum = $ENV{\'HTTP_COOKIE\'};
Название: Проблемка с Cookie
Отправлено: Sergg от 20 Января 2004, 16:29:35
Может я вообще дурак, но у меня и Ваш код Phoinix не работает не дома не на хостинге.