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

san*_*oid 89 http-referer redirect jsp referrer http-status-code-302

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

这是302重定向的正常行为吗?或者我的原始引用会被删除,支持" http://www.mysite.com/pageB.jsp "?那是不可取的.

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

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

谢谢您的帮助.

编辑添加:

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

Mar*_*aio 117

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

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

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

  • 注意:此测试已经执行了一段时间,现在Chrome 26的行为方式相同**即使在新标签中打开**. (26认同)
  • 注意:如果重定向页面 (domainA) 发出 _Referrer-Policy: no-referrer_ 标头,则 Chrome(和 Opera)不会在对目标页面 (domainB) 的请求上设置 _Referer_ 标头。Firefox 和 Edge 仍然会发送它。 (2认同)

Mal*_*Box 30

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

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

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

  • 对于它可能感兴趣的人,我在主要浏览器上进行了spme测试:http://stackoverflow.com/questions/2158283/will-a-302-redirect-maintain-the-referer-string/5441932#5441932 (17认同)

Pek*_*ica 12

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

RFC 2616对此问题保持沉默:

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

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

解决方法

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

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

  • 实际上,您通过在URL中覆盖引用来丢失安全性.在大多数现代浏览器中,无法通过JavaScript更改AJAX请求的引用; 但是,URL显然可以.这意味着在发生XSS攻击时,引用者比URL参数更可信.不要误解我的意思,引用者仍然显然是用户输入,不能完全信任.但是为其他人欺骗这些数据要比更改URL要困难得多. (3认同)

fre*_*727 6

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

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

<meta http-equiv="refresh" content="0; url=pageC.jsp" />
Run Code Online (Sandbox Code Playgroud)

结果令人惊讶:

  • Referer是带有Chrome的pageB
  • Referer是FireFox和IE的EMPTY!

希望这可以提供帮助