[Perl] (CGI?) Как сделать редирект?

Geddi-S

Хотелось бы сделать редирект на страницу (а точней, на этот же pl, только с другими параметрами но без использования формы и submit.
Стандартный redirect из модуля CGI не работает
Подскажите, плз, ламеру, как это осуществить

uncle17


#!/usr/bin/perl
print "Location: нужный_урл\n\n";

Geddi-S

Нет
так только на страничке напишется "Location: нужный_урл" и все.

uncle17

а может, ты сначала попробуешь?

Geddi-S

а может, я уже попробовал?
мне кажется, что мы разные вещи имеем в виду

uncle17

хинт: Перед этим принтом НЕ надо писать

print "Content-type: text/html\n\n";

evgen5555

HTTP 302 Redirect

Geddi-S

Фишка: у меня есть один большущий скрипт, который генерит страницу, реагирует на нажатия по ссылкам, содержит всякие формы итп итд (реализовано через модуль CGI). И вот я хочу сделать реакцию (редирект на эту же страницу с другими параметрами) не по submit'у, а при проверке некоторого условия.

Geddi-S

HTTP 302 Redirect
А можно поподробнее? )

uncle17

ну так вот ты по этому условию и пиши в хттп не тип документа, а команду редиректа. Что не устраивает-то?

#!/usr/bin/perl
if ($color == "red" || $color == "")
{
print "Content-type: text/html\n\n";
print "<h3>The color is ".$color."</h3>\n\n";
}
else print "Location: blue.html\n\n";

skvoria

Насколько я понял, он это хочет в модуль засунуть внутрь страницы (что само по себе изначально неправильно).
То есть, получится, что сервер начинает отдавать страницу с 200 ОК, после чего встречает ЧТО-ТО и быстренько редиректится на другую.
Чисто втупую это можно сделать выводом <script>window.location = ...</script> из контента, но ИМХО бред.
Так что +1, остальное - обман и подделка.

Geddi-S

Не совсем так.
Просто по некоторому submit'u нужно занести что-то в бд и при неуспешном выполнении этой операции переслать человека на что-то типа script.pl?action=error без использования ссылки или формы. Неужели это "обман и подделка"? И никак иначе не обойтись, чем проверять в самом начале скрипта значения какого-нибудь флага?

evgen5555

А почему redirect перловский не пашет?

Bibi

помедитируй над постом федечки. постарайся провести параллели между проверкой цвета и проверкой результата твоего sql-запроса

Geddi-S

Да блин, помедитировал. Все ясно. По "религиозным соображениям", как здесь модно выражаться, не нравится. Я в итоге сделал реакцию не по проверке param("action" а переписал это в виде функции, хоть и не очень хотелось.
А почему редирект не работает, не знаю. Сделал так:

print redirect(-url=>'http://<path>/script.pl?action=error', -nph=>1);

все равно не работает...

evgen5555



А почему редирект не работает, не знаю.
Пора взять в руки книжку

skvoria

Блин, ты что-то недопонимаешь, как мне кажется.
скрипт (пишу условно):
%form = &get_input;
if( $form{ 'submit' } ) {
   &save_database;
   print "Location: script.pl?id=1\n\n";
} else {
   &print_database;
}
Да, и еще: CGI.pm - зло.
Ты бы почитал, как оно на самом деле работает...

evgen5555

подмена Location в ответ на HTTP 200 OK — полнейшая ересь и долбоебизм!

skvoria

Никто не спорит.

Geddi-S

Пора взять в руки книжку
Угу, спасибо Вчитался в ман, оказывается этот редирект генерит только необходимый заголовок... shame on my head

Geddi-S

Да, и еще: CGI.pm - зло
Да блин, я не спец в протоколах разных итп... А что посоветуешь на будущее? HTML::Template?

qsk78

Если будешь использовать шаблонизатор, то советую Template Toolkit.
Просто возможностей HTML::Template через некоторое время перестанет хватать.

Geddi-S

Спасибо за совет)
Закончу сейчас писать "вебморду" (интересное, кстати, слово обязательно заботаю шаблонизатор.

uncle17

а у нас главная страница всю жисть "мордой" называется

tokuchu

Да ему скорее-всего JavaScript-ом нужно редиректнуться по клику какому-нибудь. Или AJAX какой-нибудь намутить.
Оставить комментарий
Имя или ник:
Комментарий: