302重定向是否会维护引用字符串?

时间:2010-01-28 21:58:15

标签: jsp redirect referrer http-status-code-302 http-referer

我需要将用户从一个页面重定向到另一个页面,但我需要维护原始的referer字符串。因此,例如,如果他们从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 个答案:

答案 0 :(得分:112)

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

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

    登陆domainB时,
  • IE8 referer为:domainX(即使使用InPrivate浏览,甚至用户在新标签页中打开链接时)
  • 登陆domainB时
  • Safari4 referer是:domainX(即使用户在新标签页中打开链接)
  • 登陆domainB时,
  • FF3.6.10 referer为:domainX(即使用户在新标签页中打开链接)
  • 登陆domainB时
  • Chrome5 referer为:domainX(除非用户在新标签页中打开链接)
  • 登陆domainB时,
  • Chrome26 referer为:domainX(即使用户在新标签页中打开链接)

答案 1 :(得分:28)

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

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

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

答案 2 :(得分:12)

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

RFC 2616对这个问题保持沉默:

  

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

我不相信浏览器会发送正确的引用者。我打赌至少有一个发送的东西与其他东西不同。

解决方法

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

通过这种方式,你可以确保始终获得正确的结果,并且你不会在安全方面失去任何东西:引用者可以伪造任何一种方式。

答案 3 :(得分:5)

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

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

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

结果令人惊讶:

  • Referer是带Chrome的pageB
  • Referer与FireFox&amp; IE!

希望这可以提供帮助