【发布时间】:2012-03-28 16:53:25
【问题描述】:
我有一个实现 post/redirect/get 模式的网页,以避免在简单的 CRUD 应用程序中重复发布。
这里的预期请求/响应顺序是:
- 浏览器通过
POST发送数据 - 服务器修改数据库,响应状态
302 Moved Temporarily和Location标头 - 浏览器通过
GET跟随重定向 - 服务器响应更新页面
这就是它应该如何工作的——它确实如此,例如在 Chrome 中。
然而,Internet Explorer 9 也将步骤 3 作为POST 发送(包括完整的表单数据集!)。为什么?我应该怎么做才能让它使用GET?
除了查询字符串之外,我应该添加重定向到与表单目标相同的位置。
我试过了:
- 所有可用的渲染模式(IE7、IE8、IE9、Quirks、Standards、Compat)
- 完整的 DOCTYPE
-
Location标头中的相对 URL 或绝对 URL - HTTP 状态 303(只是看看这是否有什么不同)
【问题讨论】:
-
用最简单的例子为我工作,根本没有 DOCTYPE 等等。你确定 IE9 实际上确实发送了第二个相同的 POST 请求吗?中间没有代理或其他任何东西?
-
好吧,查看调试器中的网络选项卡告诉我这一点。服务器也会收到一个 POST。
-
RFC 2616 for HTTP/1.1 声明,在第 10.3.3 节中,status code definitions 响应
302响应的浏览器应该不更改正在使用的方法 -所以一个 POST 应该是一个 POST。 IE实际上做得对。但是根据您的最后一个要点,303应该 变成 GET,所以 IE 做错了那个。 -
@StephenP 我明天再试试。感谢您提供规范的链接。
-
对此有解决方案吗?我在 IE10 和 IE11 中看到了相同的行为。即使发送 303 响应也不起作用。
标签: internet-explorer http post-redirect-get