【问题标题】:HTTP response with redirect, but without roundtrip?带有重定向的 HTTP 响应,但没有往返?
【发布时间】:2009-04-01 10:12:14
【问题描述】:

我希望浏览器反映用于创建请求的 URL 以外的其他 URL,但不往返于服务器。

我可能会这样做:

POST /form HTTP/1.1
...

...然后返回:

HTTP/1.1 200 OK
Location: /hello

但这会导致重定向,浏览器会再次请求 URL /hello。

我想告诉浏览器,虽然您刚刚发送的请求是 POST /some_url,但我现在返回的实际资源实际上称为 GET /hello/1,但没有执行往返。即位置:...

有没有办法使用 JavaScript 或 base="" 属性来做到这一点?这将告诉浏览器在我按 F5(刷新)而不是那个时请求 /hello/1,发布提交警告?

【问题讨论】:

    标签: http redirect


    【解决方案1】:
    HTTP/1.1 200 OK
    Location: /hello
    

    实际上这可能行不通;它应该是 30x 状态而不是 200(“303 See Other”最适合对 POST 的响应),并且“Location”应该是完整的绝对 URL。

    (如果您的脚本只是说“位置:/relativeurl”而没有 30x 状态,CGI 服务器通常会通过获取新 URL 并返回它来执行内部重定向,而不告诉浏览器发生了任何有趣的事情。这听起来像你想要,但这并不是真的,因为从浏览器的角度来看,它与返回 200 和直接页面的原始脚本没有什么不同。)

    但这会导致重定向,浏览器会再次请求 URL /hello。

    在实践中,这可能没有您想象的那么糟糕,这要归功于 HTTP/1.1 keep-alives。只要它位于同一服务器上,客户端就应该能够立即(在下一个数据包中)响应重定向。

    有什么方法 [...] 当我点击 F5(刷新)而不是那个,发布提交警告时,它会告诉浏览器请求 /hello/1?

    不。坚持使用 POST-Redirect-GET 模型来解决这个问题。

    【讨论】:

    • 好的,事情就是这样,我不想要往返是有原因的,这不是性能。如果我可以结合请求准备响应,我可能想根据 POST 传递和/或操纵该请求,并且如果我往返就不能那么容易地完成。
    • 我尝试使用唯一的 ID 并通过将其放入路径设置为 /hello/1 的 cookie 中来实现往返。然后,该值将由 GET /hello/1 和服务器端获取,我将能够获取我为该请求缓存的任何状态。这行得通,但你怎么想?
    • 我通常做的是在重定向查询字符串上放一个参数,以供后续请求提取。由于 cookie 在站点上打开的所有页面/窗口之间共享,因此该参数确保操作后响应信息进入正确的窗口。
    • (然后我用时间戳值备份它,所以操作后信息会在一段时间后“过期”。所以如果您添加书签或以其他方式返回相同的 URL,则相同信息不再出现。)
    • 如果您有 大量 数据要输出以响应某个操作,那么这可能不太实用;您可以将其临时存储在数据库中并将其键入参数,但这开始变得有点烦人。
    【解决方案2】:

    没有。 Http是无状态的,每一个请求都有一个答案。当您发布时,您需要立即重定向到获取页面以防止重复发布 - 您不希望它位于该帖子网址上。重定向是告诉浏览器它在一个新页面上。这就是它的工作方式。

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多