使用浏览器应发送到重定向位置的 HTTP 重定向发送信息?

Posted

技术标签:

【中文标题】使用浏览器应发送到重定向位置的 HTTP 重定向发送信息?【英文标题】:Sending info with a HTTP redirect that the browser should send to the redirected location? 【发布时间】:2010-11-01 00:08:54 【问题描述】:

这可能吗.. 例如,假设我用 302(或 303)响应请求,并通知浏览器向给定位置发出请求。. 是否有我可以发送的标头HTTP 302,以便来自浏览器的后续请求包含该标头?

我知道我可以使用位置标头执行此操作,如在重定向中并将 url 中的信息指定为查询字符串.. 但我想知道是否有更好的方法.. 似乎它应该是合法的场景..

'内容已移动,到这里.. 哦,你会想把它带到重定向位置'

我猜是个大胖子!

提前致谢。


编辑

这样做的原因是关于 PRG 模式,您有一个 GET url 和 POST url,假设您发布数据并且它是不可接受的,服务器会将您重定向到 GET,并执行一些“魔术”为了将数据“发送”到该 GET,通常使用会话状态来存储变量。

但是,在发生许多 PRG 请求的情况下,这种情况可能崩溃,当然这不是常见的情况,通常没有人需要担心这一点。但如果你这样做 - 你会需要一种方法来识别请求,这可以通过在 302 中发送的查询字符串参数来完成.. 以便可以根据该请求将特定条目置于会话状态。

问题是关于尝试从 url 中删除“请求键”,并使其更加隐含。cookie“似乎”可以工作,但它们只会让搞砸的窗口更小。

如果你去我指定的“位置”,发送这些参数会很棒。


编辑

请注意,我并不是要让浏览器向该位置发送任意标头,而是如果有任何标头旨在提示请求的上下文(例如查询字符串参数)。

【问题讨论】:

无论如何你需要它做什么?也许一个用例能让我们更好地了解您的问题。 【参考方案1】:

重定向响应本身不包含任何数据。您可以使用带有查询参数的 URL 进行重定向,但新的“位置”需要知道如何使用这些参数。

【讨论】:

tvanfosson,是的,我知道重定向不包含数据,任何查询参数都只是..需要理解的参数..但是,我特别想知道的是它是否是可以将这些参数发送到查询字符串之外。 Cookies 例如,如果我发送了一个被接收者删除的 cookie(重定向是相对的),如果同时发生多个这些类型的重定向,那是否现实?从请求发回的 cookie 仅与后续请求一起发送,而不与其他请求混合(在同一台机器上(即,假设我在完全相同的实例上点击了重定向我的相同 url))? 如果重定向和目标页面在同一个主机名上,那么是的,重定向发送的cookie应该被客户端接收并发送回目标页面。所以是的,您可以设置一个带有重定向的 cookie,并让该 cookie 向前通信。然而,cookies 当然不能跨域工作,所以对于跨域重定向来说,发送信息的唯一需要就是把它放在 URL 本身,即在查询字符串上。 浏览器可能存在竞争条件,如果在此窗口重定向的精确时刻在另一个选项卡/窗口中设置了来自同一域的相同 cookie,它可能会发送另一个 cookie反而。一些客户端/浏览器会拒绝 cookie 也是合理的。【参考方案2】:

不,这是不可能的。你不能强迫客户做某事。你可以说“这不是正确的位置,而是尝试那个位置”。但不能保证客户端会向该新位置发送相同的请求或另一个请求。并且告诉客户端在对新位置的后续请求中添加特定的标头字段也是不可能的。

【讨论】:

那是公平的,在浏览器发送任意标头之后我并没有那么多,但想知道是否有“A”标头我可以让它发送..例如我可以让浏览器发送将查询字符串参数发送到该 url(如果它不去那里也没关系).. 那么为什么不能发送不在 URL 中的其他参数.. 这会导致安全漏洞。想想攻击者试图让受害者使用特定会话的会话固定。然后他可以说“用那个会话 id 设置这个会话 cookie”。 我不确定我是否相信这个论点,它与查询字符串参数相同。如果您的网站将它们用作会话标识符,那就太糟糕了。这纯粹是关于尝试将客户端重定向回来PRG 样式,但有关于原始请求的“id”的上下文。在我的场景中,密钥的存在纯粹是为了识别每个用户的请求实例。所以如果一次出现多个表单的帖子,则重定向是可识别的..在这种形式下使用会话状态是不可靠的..我今天可以使用查询字符串参数来做到这一点,但我真的不喜欢为此使用它们.. 此外,我还玩弄了 cookie 版本,其中 cookie 在 302 中设置,因此与后续请求一起发送.. 当运行正在执行的负载测试时,此“似乎”有效每秒大约有 100 个这样的请求.. 到目前为止,浏览器总是在 302 之后立即执行重定向请求.. 我确定浏览器中没有保证,这只是由于该过程运行的快速路径。 .

以上是关于使用浏览器应发送到重定向位置的 HTTP 重定向发送信息?的主要内容,如果未能解决你的问题,请参考以下文章

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头。无法重定向与应有的页面不同的页面

如何使用 cURL 找到我将被重定向的位置?

将 set-cookie 标头发送到 node.js 中的重定向 url

哪个浏览器不能使用标头位置重定向?

转发(forward)和重定向(redirect)的区别

spring重定向设置请求头header