Программирование => Perl => Тема начата: Forza от 18 Сентября 2004, 16:20:04
Название: функция referer()
Отправлено: Forza от 18 Сентября 2004, 16:20:04
Есть в Перле функция referer(), которая возвращает URL, с которого был осуществлён переход на текущую страницу. В результате экспериметов было выяснено, что она вернёт этот URL только в том случае, если переход был осуществлён с помощью нажатия юзером на гиперссылку. То есть если URL-адрес ввести вручную в строке броузера "адрес" или сделать переход с помощью функции JavaScript (location.search = \'?choice=someChoice;param=someParam\'), то функция referer() не возвращает ничего. :( Это как-нибудь поправимо? Меня интересует вариант с переходом через ДжаваСкрипт.
Да, конечно, существует ряд вариантов обхода данной проблемы, но интересно, разрешима ли она напрямую, раз уж я столкнулся с ней. ;)
Название: функция referer()
Отправлено: Меняздесьдавнонет от 18 Сентября 2004, 17:02:58
проблема реферера к перлу не имеет никакого отношения Использовать реферер для любых целей, кроме справочных - бессмысленно.
Название: функция referer()
Отправлено: Forza от 18 Сентября 2004, 17:51:46
Цитировать
RomikChef: Использовать реферер для любых целей, кроме справочных - бессмысленно.
Ок. Просто я "взял" его из книги Дюбуа про MySQL+Perl. Там после добавления товара в корзину вызывалось print redirect (referer()) для вывода той же страницы, откуда товар был добавлен.
А как лучше реализовать нижеследующее: Есть форма авторизации с ссылкой "я забыл пароль". Если чел его забыл, то он в форме заполняет поле "логин" и жмёт "я забыл пароль". JS-функция func1() проверяет непустоту поля "логин", если пустое - выводит сразу же сообщение на этой же странице, если непустое - отсылает запрос на сервер. Сервер, если логин существует, выводит новую страницу "вам на е-мэйл был отправлен пароль", а если логин не существует - на этой же странице (а она м.б. любой - корзиной, каталогом, результатом поиска и т.д.) должен вывести сообщение "указан несуществующий логин". [OFF]Всё вышеописанное обсуждать не надо, т.к. придумал не я, и так оно должно и остаться.[/OFF]
Вижу 2 варианта: 1) Используем
Название: функция referer()
Отправлено: Меняздесьдавнонет от 18 Сентября 2004, 18:08:08
Дюбуа понимвает в базах данных но ничего не смыслит в веб-приложениях в таком случае.
А в форме с логином и паролем я вообще не понимаю, зачем нужен яваскрипт.
Название: функция referer()
Отправлено: Forza от 18 Сентября 2004, 19:42:17
Цитировать
RomikChef: Дюбуа понимвает в базах данных но ничего не смыслит в веб-приложениях в таком случае.
Он приводил использование referer() только для вышеуказанного конкретного случая и ничего не говорил про то, что это стоит использовать везде.
Цитировать
RomikChef: А в форме с логином и паролем я вообще не понимаю, зачем нужен яваскрипт.
В форме есть 2 текстовых поля под логин и пароль, кнопка для сабмита формы (авторизации) и гиперссылка для "забытого пароля". По нажатию на гиперссылку из формы надо взять логин, отослать его на сервер, который вышлет на е-мэйл, связанный в базе с этим логином, его пароль. Как ещё, не используя ДжаваСкрипт, по нажатию на г-ссылку (а не на кнопку!) переслать текстовое поле формы, я не знаю. [OFF]Ещё раз повторю, что дизайн формы - вне моей компетенции.[/OFF]
Название: функция referer()
Отправлено: Меняздесьдавнонет от 18 Сентября 2004, 20:32:11
Зато в твоей компетенции задавать вопрос по яваскрипту в форуме по перлу, да.
Название: функция referer()
Отправлено: Forza от 18 Сентября 2004, 20:37:46
Блииииииииииин, да разве я спрашивал что-то конкретное по джаваскрипту? Я спросил, как лучше это реализовать с помощью комбинации перл+джаваскрипт. У меня теперь нет вопросов по синтаксису, есть вопрос по "идеологии".
[OFF]Ты опять в своём стиле. К тебе больше вопросов не имею. Не утруждай себя ответом.[/OFF]
Название: функция referer()
Отправлено: Меняздесьдавнонет от 18 Сентября 2004, 23:08:03
По перлу тут пока не прозвучало ни одного вопроса.
И меня совершенно не утруждают попытки заставить тебя хоть немного подумать головой :-)
Название: функция referer()
Отправлено: Mog. от 19 Сентября 2004, 07:51:34
Цитировать
Forza: В результате экспериметов было выяснено, что она вернёт этот URL только в том случае, если переход был осуществлён с помощью нажатия юзером на гиперссылку. То есть если URL-адрес ввести вручную в строке броузера "адрес" или сделать переход с помощью функции JavaScript (location.search = \'?choice=someChoice;param=someParam\'), то функция referer() не возвращает ничего.
referer он потому и referer что referer, т.е. ссылающийся, а не набранный в адресной строке или еще какой. Если есть ссылающаяся страница, то браузер отправляет её адрес, а если нет страницы, то и адреса нету. Perl здесь совершенно ни при чем, т.к. он берет эти данные изпеременных окружения сервера, а тот, в свою очередь, из переданных в запросе к нему данных.
Название: функция referer()
Отправлено: Phoinix от 19 Сентября 2004, 20:13:53
Forza Собственно (я опоздал к началу дискуссии) Можно ли уточнить, что подразумевается под Perl функцией referer??? Что-то я в своем любимом справочнике её не нашел... :(
Цитировать
Первый вариант выглядит предпочительней как более логичный , а также не требующий полного рефреша страницы в случае ненахождения логина в базе.
Ни первый ни второй не логичны... Не надо никаких переходов JavaScript
JavaScript проверяешь заполненность поля "логин", и в случае успеха form.submit, иначе, алерт там, или предупреждение...
Название: функция referer()
Отправлено: Forza от 19 Сентября 2004, 22:02:03
Цитировать
Phoinix: Можно ли уточнить, что подразумевается под Perl функцией referer???
Это из модуля СGI.pm: referer() Return the URL of the page the browser was viewing prior to fetching your script. Not available for all browsers. см. http://stein.cshl.org/WWW/software/CGI/
Мне уже объяснили. Я его больше не использую.
Цитировать
Phoinix: JavaScript проверяешь заполненность поля "логин", и в случае успеха form.submit, иначе, алерт там, или предупреждение...
На самом деле я так и решил делать. Только перед form.submit() меняю значение для на forgotPassword, потому что по умолчанию сабмит формы (в случае нажатия на кнопку или на Enter) должен приводить к авторизации юзера.
Название: функция referer()
Отправлено: Forza от 20 Сентября 2004, 11:07:32
И всё-таки, как лучше реализовать нижеследующее без print redirect (referer()):
У меня что-то типа Инет-магазина, юзер заходит поначалу в качестве гостя, и на каждой странице (каталог, поиск, корзина) для него есть меню с формой авторизации. Надо чтобы после авторизации юзер остался на той же странице, у которой немного изменятся меню и проч., но не основное содержание: т.е. исчезнет форма авторизации, появится имя юзера в приветствии и т.д., но при этом юзер должен, например, остаться в каталоге на ту же самую букву.
Раньше я после удачной авторизации вносил в переменные сессии ID юзера из базы, сохранял сессию и писал print redirect (referer()). И далее по наличии в переменных сессии ID юзера скрипт догадывался, имеем мы дело с гостем или с зарегистрированным юзером.
p.s. Можно, наверное, записывать текущий урл в hidden формы авторизации, а потом после выполнения авторизации делать по нему переход print redirect(param("url"))
Название: функция referer()
Отправлено: AnnA от 20 Сентября 2004, 14:50:18
Название: функция referer()
Отправлено: Forza от 20 Сентября 2004, 15:05:53
И зачем мне буттон с history.go(-1)? Мне же не просто надо вернуться с URL#2 на URL#1, а надо после обращения на URL#2 (что-то типа "...?choice=authorize") обработать параметры в соовтетствии с URL #2, но вывести страницу по URL #1 (что-то типа "...?choice=view;letter=A"). В принципе "history.go(-1)" можно использовать так, чтобы вывод в броузер результата работы URL#2 заключался в безусловном вызове , т.е. обработали запрос на авторизацию и вернули юзера на шаг назад, где в параметрах сессии присутствует результат авторизации.
Так что универсальней - использовать это? Или передавать URL#1 в хиддене формы, а потом после обработки логина и пароля (параметры URL#2) делать print redirect(param("URL#1"))?
Название: функция referer()
Отправлено: Phoinix от 20 Сентября 2004, 18:55:40
Forza Теперь что-то не понятное с сессией, и возвратом... что-то не вижу никакой связи...
Чем обоснован отказ от $ENV{\'HTTP_REFERER\'}? При сабмите формы рефер передается скрипту, даже если сабмит производится JavaScript...
Зачем его передавать в hidden? это его, как минимум, надо будет каждый раз формировать...
навскидку:
login.pl
#!/usr/bin/perl -w use strict; use CGI qw(param); my $referer = $ENV{\'HTTP_REFERER\'} ? $ENV{\'HTTP_REFERER\'} : \'http//www.mysite.ru/\'; my $check = \'false\'; ... # получаем и проверяем логин и пароль, прописываем, где что надо ... if ($check eq \'false\') {$referer .= $referer =~ /[обратный слеш]?/ ? \'&login=false\' : \'?login=false\'}
print "Location: $referer\\n\\n"; exit;
не вижу ни одной причины поиска обходных путей...
Название: функция referer()
Отправлено: Меняздесьдавнонет от 20 Сентября 2004, 18:57:20
Цитировать
Phoinix: Чем обоснован отказ от $ENV{\'HTTP_REFERER\'}?
тем, что это НЕОБЯЗАТЕЛЬНОЕ поле. А вот записывать текущий урл в хидден -прекрасное решение.
Название: функция referer()
Отправлено: Phoinix от 20 Сентября 2004, 19:10:03
RomikChef Ух ты... тогда и $ENV{\'SERVER_NAME\'} - тоже необязательное; $ENV{\'REQUEST_URI\'} - тоже необязательное;
или hidden формировать с помощью других переменных можно???
То что оно не обязательное, не значит что его нет... это лишь значит, что его может не быть... на что существует соответсвующая проверка... вообще трудн вообразить себе ситуацию, когда передать рефер - невозможно, или затруднительно...
Название: функция referer()
Отправлено: Меняздесьдавнонет от 20 Сентября 2004, 19:19:49
Phoinix не тупи, а? Не знаешь, что такое реферер - не вякай.
Цитировать
$ENV{\'REQUEST_URI\'} - тоже необязательное;
сравнил опу с пальцем.
Цитировать
Phoinix: вообще трудн вообразить себе ситуацию, когда передать рефер - невозможно, или затруднительно...
Трудно вообразить ситуацию, когда ты ВООБЩЕ можешь с сервера хоть как-то повлиять на передачу этого заголовка. И уж тем более - "передавать". Чудик.
Название: функция referer()
Отправлено: Phoinix от 20 Сентября 2004, 19:21:36
Forza При submit формы referer ВСЕГДА передается...
А у тебя авторизация. Я не знаю, с каких это пор, мы проходим авторизацию, передавая логин и открытый(!) пароль в строке браузера...
Название: функция referer()
Отправлено: Phoinix от 20 Сентября 2004, 19:26:13
RomikChef
Цитировать
Не знаешь, что такое реферер - не вякай.
Может и незнаю... просвети несмышленного пожалуйста...
Вообще разговор идет на конкретном примере, как вернуться назад при submit формы...
Почему нельзя обойти submit я уже написал...
Зачем формой передавать еще переменную, а потом её обрабатывать, если эти данные и так есть???
Название: функция referer()
Отправлено: Меняздесьдавнонет от 20 Сентября 2004, 19:27:24
Цитировать
Phoinix: При submit формы referer ВСЕГДА передается...
рассказывай эти сказки своей бабушке.
Название: функция referer()
Отправлено: Phoinix от 20 Сентября 2004, 19:34:01
RomikChef О как... А на примере можно???
Когда referer нет в заголовке? При submit формы?
У меня может и опыта меньше, и знаний не хватает, но вот никогда не испытывал затруднений в получении данного параметра...
Название: функция referer()
Отправлено: Phoinix от 20 Сентября 2004, 20:10:50
RomikChef Ну раз ответа нет, то я сам отвечу...
Заблокировать referer можно только на фаерволе, но, при этом, данной функцией не пользуются, т.к. многие сайты его (referer) проверяют, и говорить о том, что часто referer не передается - неправильно. Да, конечно, утяжелять код дополнительными полями (формирование его я даже не считаю), логично, вдруг один из тысячи пользователей почуствует неудобство... а остальные 999???
А я дома сижу на модеме, нет у меня ни домашних сетей в городе ни выделенок... и скорость мне дает местный ужел связи 9К максимум... Да, конечно, сейчас 80% пользователей сидят на скоростном доступе, им не страшны лишние 2Кб...
Может я и поспешил, с утверждением "ВСЕГДА", но точку зрения не поменял...
Название: функция referer()
Отправлено: Forza от 21 Сентября 2004, 00:17:47
Какая тут дискуссия развелась в моё отсутствие.
Цитировать
Phoinix: Чем обоснован отказ от $ENV{\'HTTP_REFERER\'}?
В доке к CGI.pm было написано "Not available for all browsers".
Цитировать
Phoinix: Я не знаю, с каких это пор, мы проходим авторизацию, передавая логин и открытый(!) пароль в строке браузера...
Почему в строке браузера? Форма передаётся методом POST.
Цитировать
Phoinix: Когда referer нет в заголовке?
Да, RomikChef, приведи, пожалуйста, пример, когда при сабмите формы REFERER может отсутствовать.
Название: функция referer()
Отправлено: Green Kakadu от 21 Сентября 2004, 01:12:32
Цитировать
когда при сабмите формы REFERER может отсутствовать.
напр. если форму сабмитить роботом
Название: функция referer()
Отправлено: Меняздесьдавнонет от 21 Сентября 2004, 10:39:18
Да при чем здесь роботы? Это. Поле. Не. Обязательное. Все. Этого должно быть достаточно.
Реферер посылается ПО ЖЕЛАНИЮ браузера. А так же - по воле посредников. Если кто не знает - бывают такие кэширующие прокси. А если кто еще подумает немножко, то поймет, что в запросах, идущих через такую прокси, ВСЕГДА отсутствует реферер.
Цитировать
Phoinix: Заблокировать referer можно только на фаерволе, но, при этом, данной функцией не пользуются
Это вообще детский лепет. Практически все домашние файрволлы режут реферер по умолчанию и никто, естественно, эту функцию не отключает
Название: функция referer()
Отправлено: Forza от 24 Сентября 2004, 16:34:24
Итак, возвращение к исходной странице после сабмита формы я сделал с помощью хранения урла в хиддене.
Теперь, ещё раз пробегаясь по скрипту, я "вспомнил", что после оформления добавления товара в корзину (обработка урла "my.pl?action=add;id=1") опять же вызывалось print redirect (referer()) для вывода той же страницы. Получается, что теперь в каждый урл добавления определённого товара надо вставить информацию о каталоге, из которого он был добавлен, или ключевые слова поиска, из результатов которого он был добавлен. Или, может быть, лучше повесить на onClick JS-функцию, которая будет запускать в невидимом фрейме обработчик добавления в корзину, а потом рефрешить страницу (рефреш нужен, т.к. на каждой странице есть счётчик товаров в корзине)?