Будет ли перенаправление 302 поддерживать строку реферера? - PullRequest
87 голосов
/ 29 января 2010

Мне нужно перенаправить пользователя с одной страницы на другую, но мне нужно сохранить исходную строку реферера. Так, например, если они начинаются с http://www.othersite.com/pageA.jsp,, нажмите на ссылку, которая переводит их на http://www.mysite.com/pageB.jsp,, которая затем выполняет перенаправление 302 на http://www.mysite.com/pageC.jsp, Мне нужно, чтобы строка реферера содержала " http://www.othersite.com/pageA.jsp"

Это нормальное поведение для перенаправления 302? Или мой первоначальный реферер был бы отброшен в пользу "http://www.mysite.com/pageB.jsp"? Это было бы нежелательно.

Я не знаю, имеет ли это какое-то значение, но я работаю в JSP и использую response.sendRedirect () для выполнения перенаправления 302.

Я должен упомянуть, что я провел эксперимент с этим, и он, похоже, сохранил исходную строку реферера ("http://www.othersite.com/pageA.jsp"), но я просто хотел убедиться, что это нормальное поведение по умолчанию, а не что-то странное на моем конце.

Спасибо за вашу помощь.

ИЗМЕНЕНО В ДОБАВИТЬ:

Хотя в настоящее время я использую перенаправление 302, я мог бы вместо этого использовать перенаправление 301. Знаете ли вы, является ли поведение для переадресации 301 более надежным?

Ответы [ 4 ]

113 голосов
/ 26 марта 2011

Я не знаю о 302, но сегодня я протестировал 301 на некоторых браузерах, вот результаты:

СЦЕНАРИЙ : пользователь нажимает ссылку на доменX, указывающую на домен А. домен A выполняет перенаправление 301 на домен B.

  • IE8 referer при посадке на domainB: domainX (даже при использовании просмотра InPrivate и даже когда пользователь открывает ссылку в новой вкладке)
  • Safari4 referer при посадке на домен B: domainX (даже когда пользователь открывает ссылку в новой вкладке)
  • FF3.6.10 referer при посадке на домен B: domainX (даже когда пользователь открывает ссылку в новой вкладке)
  • Chrome5 referer при посадке на домен B: domainX (, если пользователь не открывает ссылки в новой вкладке)
  • Chrome26 referer при посадке на domainB - это: domainX (даже когда пользователь открывает ссылки в новой вкладке)
29 голосов
/ 29 января 2010

Краткий ответ: он не указан в соответствующем RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 ни для заголовка Referer, ни для кода состояния 302.

Лучше всего сделать тест с несколькими браузерами и посмотреть, есть ли согласованное поведение.

Для полного пояса и фигурных скобок закодируйте исходный реферер в URL перенаправления, чтобы гарантировать его получение.

12 голосов
/ 29 января 2010

Хороший вопрос. В этом случае отправка реферера полностью зависит от браузера (поскольку браузеру предписано сделать еще один запрос к новому ресурсу).

RFC 2616 хранит молчание по этому вопросу:

Запрашиваемый ресурс временно находится под другим URI. Поскольку перенаправление может иногда изменяться, клиент ДОЛЖЕН продолжать использовать Request-URI для будущих запросов. Этот ответ может быть кэширован, только если он указан в поле заголовка Cache-Control или Expires.

Я бы не стал доверять браузеру отправку правильного реферера. Бьюсь об заклад, есть хотя бы один, который посылает что-то другое, чем другие.

Обход

Если вы можете, почему бы не добавить параметр ?override_referer=<old_url> в URL-адрес, на который вы перенаправляете, и проанализировать это значение вместо HTTP_REFERER.

Таким образом, вы всегда можете получить правильный результат и ничего не потерять в безопасности: рефери может быть подделан в любом случае.

5 голосов
/ 11 сентября 2014

У меня была другая проблема: я хотел, чтобы реферер был "pageB", но ни один из существующих браузеров не работал таким образом ...

Поэтому я попытался с перенаправлением HTML на страницу B (вместо перенаправления 301 или 302).):

<meta http-equiv="refresh" content="0; url=pageC.jsp" />

И результат был удивительным:

  • Referer - это pageB с Chrome
  • Referer - пустой, с FireFox & IE!

Надеюсь, это поможет

...