我希望浏览器能够反映除用于创建请求的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?
答案 0 :(得分:5)
HTTP/1.1 200 OK
Location: /hello
实际上这可能不起作用;它应该是30x状态而不是200(“303 See Other”最适合POST的响应),“Location”应该是一个完整的绝对URL。
(如果您的脚本只是说'Location:/ relativeurl'没有30x状态,CGI服务器通常会通过获取新URL并返回它而不告诉浏览器发生任何有趣的事情来进行内部重定向。这可能听起来像你想要,但实际上并非如此,因为从浏览器的角度来看,它与返回200和直接页面的原始脚本没有什么不同。)
但这会导致重定向,浏览器会再次请求URL / hello。
在实践中,由于HTTP / 1.1保持活动,这可能没有您想象的那么糟糕。客户端应该能够立即响应重定向(在下一个数据包中),只要它位于同一台服务器上。
有没有办法[...]当我点击F5(刷新)而不是发布提交警告时,会告诉浏览器请求/ hello / 1?
不。坚持使用POST-Redirect-GET模型来解决这个问题。
答案 1 :(得分:0)
没有。 Http是无状态的,每个请求都有一个答案。当您发布时,您需要立即重定向到获取页面以防止双重帖子 - 您不希望它位于该帖子网址上。重定向是告诉浏览器它在新页面上的内容。这就是它的工作方式。