HTTP POST => 302重定向到GET的正确行为是什么?

Jos*_*all 19 redirect http

POST => 302重定向到GET的正确行为是什么?

在Chrome(可能是大多数每个浏览器)中,在POST(对于想要我重定向的资源)并且我收到302重定向之后,浏览器会自动在302位置发出GET.这甚至是众所周知的模式.但是我阅读规范的方式似乎表明这不应该发生.

HTTP规范说

如果收到302状态代码以响应GET或HEAD以外的请求,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变发出请求的条件.

小提琴手正在展示:

REQUEST 1: POST URLA
RESPONSE 1: 302 redirect to URLB
REQUEST 2: GET URLB
Run Code Online (Sandbox Code Playgroud)

上面的部分似乎说浏览器不应该发出GET请求?我错过了什么?

  1. 规范中的某些内容使得此部分无关紧要
  2. 我对自动重定向的理解是错误的(并且执行GET的chrome浏览器并没有真正自动重定向)
  3. 我的理解证实了这是一个用户
  4. 别的什么?

aba*_*ert 19

规范中的下一行开始:

注意:RFC 1945和RFC 2068指定不允许客户端更改重定向请求的方法.但是,大多数现有的用户代理实现将302视为303响应,对Location字段值执行GET,而不管原始请求方法如何.已经为希望明确清楚客户端期望哪种反应的服务器添加了状态代码303和307.

在此之后,它会解释如何处理303,这正是您所看到的.


如果你问为什么服务器仍然使用302而不是307,所有当前浏览器都能正确处理,那是因为旧的浏览器无法处理它.如果你想知道为什么浏览器将302作为303处理,那是因为旧服务器期望它.实际上没有办法摆脱那个循环,并且HTTP可能更好地将302恢复为意味着它的意思,并且弃用它(对于非GET/HEAD)而不是307.

  • @JulianReschke:我不是说你的服务器应该滥用302,我在解释为​​什么许多服务器仍然会这样做.只要所有新浏览器正确处理破坏的行为(并且它们确实如此),并且有任何旧浏览器需要破坏行为,服务器将继续滥用它.这不是一件好事,但这是事实. (2认同)