95

我需要将用户从一个页面重定向到另一个页面,但我需要维护原始的引用字符串。因此,例如,如果他们从http://www.othersite.com/pageA.jsp开始,请单击将他们带到http://www.example.com/pageB.jsp的链接,然后执行 302重定向到http://www.example.com/pageC.jsp,我需要包含引用字符串http://www.othersite.com/pageA.jsp

这是 302 重定向的正常行为吗?或者我原来的推荐人会被放弃,转而支持http://www.example.com/pageB.jsp?那是不可取的。

我不知道它是否有任何区别,但我正在使用 JSP,并且我正在使用response.sendRedirect()执行 302 重定向。

我应该提到我对此做了一个实验,它似乎保留了原始的引用字符串(http://www.othersite.com/pageA.jsp),但我只是想确保这是正常的默认行为,而不是我的奇怪行为。


虽然我目前正在使用 302 重定向,但我可能会改用 301 重定向。您知道 301 重定向的行为是否更可靠?

4

4 回答 4

125

我不知道302,但我今天在一些浏览器上测试了301,结果如下:

场景:用户单击domainX上指向 domainA 的链接。domainA 执行 301 重定向到 domainB。

  • 登陆 domainB 时的IE8referer是:domainX(即使使用 InPrivate 浏览,甚至当用户在新选项卡中打开链接时)
  • 登陆domainB时的Safari4referer是:domainX(即使用户在新标签页中打开链接)
  • FF3.6.10referer登陆 domainB 时为:domainX(即使用户在新选项卡中打开链接)
  • 登陆domainBreferer时的 Chrome5 为:domainX(除非用户在新标签页中打开链接)
  • 登陆domainBreferer时的 Chrome26 是:domainX(即使用户在新标签页中打开链接)
于 2011-03-26T11:15:31.787 回答
33

简短的回答是在相关的 RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36中没有为 Referer 标头或 302 状态代码指定。

您最好的选择是使用多个浏览器进行测试,看看是否存在共识行为。

对于完整的腰带和大括号,请在重定向 URL 中对原始引荐来源网址进行编码,以便您可以保证检索到它。

于 2010-01-28T22:05:51.853 回答
12

好问题。在这种情况下,referer 的发送完全取决于浏览器(因为浏览器被告知要向新资源发出另一个请求)。

RFC 2616对此问题保持沉默:

请求的资源临时驻留在不同的 URI 下。由于重定向有时可能会改变,客户端应该继续使用 Request-URI 来处理未来的请求。此响应仅在由 Cache-Control 或 Expires 标头字段指示时才可缓存。

我不相信浏览器会发送正确的推荐人。我敢打赌,至少有一个发送的东西与其他的不同。

解决方法

如果可以,为什么不?override_referer=<old_url>向您重定向到的 URL 添加一个参数,并解析该值而不是 HTTP_REFERER。

这样您就可以确保始终获得正确的结果,并且您不会在安全方面失去任何东西:无论哪种方式都可以伪造引荐来源网址。

于 2010-01-28T22:04:23.900 回答
8

我遇到了相反的问题:我希望引用者是“pageB”,但没有一个当前浏览器以这种方式进行......

所以我尝试在 pageB 上使用 HTML 重定向(而不是 301 或 302 重定向):

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

结果令人惊讶:

  • 引用者是带有 Chrome 的 pageB
  • 在 FireFox 和 IE 中,Referer 为空!

希望这可以帮助

于 2014-09-11T15:08:08.180 回答