Forum Webscript.Ru
Программирование => Perl => Тема начата: 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-файл.
Кто все таки понял что я имел ввиду и знает как мне помочь, то помогите пожалуйста.
-
script.cgi покажи.
-
Вот рабочая часть скрипта отвечающая за запись нужных мне 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";}
}
-
Ты заголовки вставляеш как попало. Повнимательнее с ними.
Вот тебе рабочий пример:
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 записываются и все 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 нет вроде не чего)?
-
Что так не кто и не знает в чем здесь может быть проблема?
-
Sergg
AFAIK Заголовки Location и Set-cookie - не работают если скрипт вставлен через SSI...
Как вариант, можно при установке куков, просто запускать отдельный скрипт устанавливать куки, а потом сразу редиректить обратно...
-
Это конечно вариант, но хочется как-то по человечески все сделать.
-
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 все работает. Я, как правило, проверяю то что пишу.
-
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...
Попробую как ты говоришь...
-
NeoNox
Иногда работа Perl скриптов несколько удивляет... надо книжки еще почитать...
При использовании Location выводит уже не ошибку, а ссылку на URL куда редиректил... Куки соответсвенно тоже не проставляются, и IMHO знаю почему (эта тема уже обсуждалась).
(Это не лекция, это рассуждение... ;))
Тег (заголовок) закрыт, началось тело страницы
скрипт уже вставляется в тело страницы, когда заголовок передан, соответственно, передача других заголовков скриптом не пройдет... Даже если его "инклюдить" в head страницы...
Либо я где-то неправ в настройках...
-
Кстати, как вариант вызов скрипта таким образом -
-
Phoinix
Вероятно это зависит от реализации броузера.
Это проверено на Мозилле, на ИЕ нет возможности проверить.
-
Настройка моего 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, только в сам скрипт предется дизайн вписывать.
-
NeoNox
:) Интересно, но заработало, правда в таком случае отпадает надобность использования SSI... Жаль что редирект при этом не срабатывает... но это совершенно другая история...
-
Вариант с img у меня тоже работает (по крайней мере на IE), только что-то не могу найти файлы cookie от NN (в папке с NN есть файл cookie.txt но туда что не чего не пишется).
-
Sergg
Ну не знаю... по крайней мере в Mozilla 1.5. - работает...
NeoNox
IMHO все-таки зависит от платформы... т.к. Mozilla 1.5 дает тот же результат что и IE
-
Записаваться сейчас cookie записываются (используя img), а вот с их чтением при вставке скрипта через SSI таже проблема (при запуске самого скрипта cookie читаются и обрабатываются, а при запуске через SSI не чего не читается).
Я раньше как-то не думал, что при использовании SSI могут быть такие проблемы (А я и не знал, что любовь может быть так жестока :)).
-
Sergg
Вот со чтением через SSI никогда у меня проблем не было... а код какой?
my $envname="HTTP_COOKIE";
my $cook=$ENV{$envname};
-
Код в самом начале топика был написан:
$hum = $ENV{\'HTTP_COOKIE\'};
-
Может я вообще дурак, но у меня и Ваш код Phoinix не работает не дома не на хостинге.