302和307重定向有什么区别?

Zac*_*sch 196 redirect http

a 302 FOUND307 TEMPORARY REDIRECTHTTP响应有什么区别?

W3规范似乎表明它们都用于临时重定向,除非响应特别允许,否则它们都不能被缓存.

Chr*_*Orr 153

307 came about because user agents adopted as a de facto behaviour to take POST requests that receive a 302 response and send a GET request to the Location response header.

这是不正确的行为 - 只有 303应该导致POST变成GET.如果原始POST请求返回302,则用户代理应该(但不要)在请求新URL时坚持使用POST方法.

引入了307以允许服务器向用户代理明确说明在遵循Location响应头时客户端应该进行方法更改.

  • @ makerofthings7所有浏览器都错误地处理`302`.Chrome 30,IE10.它成为*事实上*错误的实现; 这是无法改变的,因为很多网站都会错误地发出问题302.事实上,ASP.net MVC错误地发出302,*取决于浏览器处理错误的事实. (5认同)
  • 任何响应不正确的用户代理示例?它通常只占访客的很小比例吗? (2认同)

Fra*_*nov 94

所不同的关注重定向POST,PUTDELETE请求和服务器的期望是为用户代理行为(什么RFC 2616):

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

另外,阅读有关30x重定向代码的维基百科文章.


Kri*_*ams 56

实际操作的一个很好的例子307 Internal Redirect是Google Chrome遇到对其知道需要严格传输安全的域的HTTP调用.

浏览器使用与原始调用相同的方法无缝重定向.

HTST 307内部重定向

  • 你知道谷歌什么时候实现这个功能的吗? (2认同)
  • 是的,这就是我看到它发生的地方 - 我们的服务器没有发送 - 在 chrome devtools 中看起来是这样,但它只是 chrome 进行重定向,因为我们有一个严格的传输安全标头 (2认同)

Ian*_*oyd 11

原来只有 302

回复 浏览器应该做什么
302 Found 使用新 url 重做请求

这个想法是:

  • 如果你GET在某个位置做一个,你会重做你GET的新 URL
  • 如果你POST在某个位置做一个,你会重做你POST的新 URL
  • 如果你PUT在某个位置做一个,你会重做你PUT的新 URL
  • 如果你DELETE在某个位置做一个,你会重做你DELETE的新 URL
  • 等等

不幸的是,每个浏览器都做错了。当得到 a 时302,他们总是切换到GET新的 URL,而不是用相同的动词(例如POST)重试请求:

  • 马赛克做错了
  • Netscape 复制了 Mosaic 中的错误;所以他们弄错了
  • Internet Explorer 复制了 Netscape 中的错误;所以他们弄错了

它变成了事实上的错误。

所有浏览器都302出错了。所以303307被创造。

回复 浏览器应该做什么 浏览器实际做什么
302 Found 使用新 url 重做请求 使用新网址获取
303 See Other 使用新网址获取 使用新网址获取
307 Temporary Redirect 使用新 url 重做请求 使用新 url 重做请求

以图表形式

5 种不同类型的重定向:

??????????????????????????????????????????????????????????????
?           ?                Switch to GET?                  ?
?           ??????????????????????????????????????????????????
? Temporary ?          No            ?         Yes           ?
??????????????????????????????????????????????????????????????
? No        ? 308 Permanent Redirect ? 301 Moved Permanently ?
??????????????????????????????????????????????????????????????
? Yes       ? 307 Temporary Redirect ? 303 See Other         ?
?           ? 302 Found (intended)   ? 302 Found (actual)    ?
??????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

或者:

回复 切换获取? 暂时的?
301 Moved Permanently
302 Found (故意的) 是的
302 Found (实际的) 是的 是的
303 See Other 是的 是的
307 Temporary Redirect 是的
308 Permanent Redirect


Roy*_*Han 8

EXPECTED为302:重定向在NEW_URL上使用相同的请求方法POST

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT POST NEW_URL
Run Code Online (Sandbox Code Playgroud)

ACTUAL for 302,303:将更改请求方法从POST重定向到NEW_URL上的GET

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
CLIENT POST OLD_URL -> SERVER 303 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
Run Code Online (Sandbox Code Playgroud)

FORT for 307:重定向在NEW_URL上使用相同的请求方法POST

CLIENT POST OLD_URL -> SERVER 307 NEW_URL -> CLIENT POST NEW_URL
Run Code Online (Sandbox Code Playgroud)


Luc*_*Luc 8

流程图

  • 301:永久重定向:URL旧,应替换。浏览器将对此进行缓存。
    用法示例: URL从/register-form.html移到signup-form.html
    根据RFC 7231,该方法将更改为GET:“由于历史原因,用户代理可以针对后续请求将请求方法从POST更改为GET。”
  • 302:临时重定向。仅用于HTTP / 1.0客户端。此状态码不应更改该方法,但是浏览器还是这样做。RFC表示:“许多HTTP / 1.1之前的用户代理不了解[303]。当需要考虑与此类客户端的互操作性时,可以改用302状态代码,因为大多数用户代理都对302响应做出了反应,如此处所述303。” 当然,有些客户可能会根据规范来实现它,因此,如果与真正的客户之间的互操作性不是真正的问题,则303对于一致的结果会更好。
  • 303:临时重定向,将方法改为GET。
    用法示例:如果浏览器将POST发送到/register.php,则现在加载(GET)/success.html
  • 307:临时重定向,同样地重复请求。
    用法示例:如果浏览器将POST发送到/register.php,则告诉它在处重做POST /signup.php
  • 308:永久重定向,同样地重复请求。其中307是303的“无方法更改”对应项,而此308状态是301的“无方法更改”对应项。

RFC 7231(自2014年起)具有很好的可读性,并且不太冗长。如果您想知道确切的答案,建议阅读。其他一些答案使用的是1999年的RFC 2616,但没有任何变化。

RFC 7238指定308状态。它被认为是实验性的,但2016年所有主流浏览器均已支持它。

  • 302 并未被弃用。 (3认同)
  • @JulianReschke 维基百科说“302 已被 303 和 307 取代。” 也许那是因为我不是母语人士,但对我来说(在这种情况下)取代和弃用意味着相同:使用 303 或 307,但不使用 302。我读错了吗? (2认同)
  • @JulianReschke 很公平,我找到了来源并且 waddaya 知道吗?你是完全正确的。[RFC](https://tools.ietf.org/html/rfc2616#section-10.3.3)实际上非常容易理解,实际上他们甚至在某些条件下推荐302。上面提到的“更新者”和“废弃者”RFC 都不是关于状态代码的,所以我猜这个 1999 年的文档确实是我们拥有的最新文档。我会更新我的答案。 (2认同)