【问题标题】:Difference between HTTP redirect codesHTTP 重定向代码之间的区别
【发布时间】:2011-06-13 10:52:03
【问题描述】:

我不清楚各种 HTTP 3XX 重定向代码之间的区别。是的,我已经阅读了规范,但是这里的标准和实际做法之间似乎存在一些差异。

301 重定向代码看起来很清楚:这意味着资源已永久移动到另一个 URI,未来的请求应该使用该 URI。

而且307 重定向代码似乎也很清楚:这意味着重定向是临时的,未来的请求仍应使用原始 URI。

但我不知道302 和303 之间有什么区别,或者为什么它们中的任何一个都与301 真正不同。似乎302 最初打算作为一个临时 重定向,(如307),但实际上,大多数浏览器将其视为303。但是303 和301 之间有什么区别? 301 是否应该意味着重定向更多是永久的?

【问题讨论】:

    标签: http redirect uri http-status-codes


    【解决方案1】:
    • 301:永久重定向。对该资源进行后续请求的客户端应使用新的 URI。对于 POST/PUT/DELETE 请求,客户端不应自动遵循重定向。
    • 302:由于未定义的原因重定向。对此资源进行后续请求的客户端应该不使用新的 URI。对于 POST/PUT/DELETE 请求,客户端不应自动遵循重定向。
    • 303:由于未定义的原因重定向。通常,“操作已完成,请在其他地方继续”。对此资源进行后续请求的客户端应该不使用新的 URI。客户端应该遵循 POST/PUT/DELETE 请求的重定向,但使用 GET 进行后续请求。
    • 307:临时重定向。资源可能会在稍后返回此位置。对该资源进行后续请求的客户端应使用旧的 URI。对于 POST/PUT/DELETE 请求,客户端不应自动遵循重定向。

    如果您可以选择,我个人建议避免使用 302。许多客户端在遇到 302 时不遵循规范。对于临时重定向,您应该使用 303 或 307,具体取决于您希望对非 GET 请求的行为类型。除非您需要 POST/PUT/DELETE 的替代行为,否则首选 307 到 303。

    【讨论】:

    • 不。跟随 303 需要将方法重写为 GET。遵循其他方法需要保留该方法,但要与 UA 确认该方法是否不安全(因此,除了 OPTIONS、HEAD、GET、PROPFIND 之外的方法......)
    • @BobAman 在您的描述中,您正在犯与原始 HTTP 规范 (RFC 1945) 中相同的错误。例如说 客户端应该遵循 POST/PUT/DELETE 请求的重定向。 在 303 重定向之后 没有 指定在以下请求中使用的 http 动词必须是 GET 是误导...
    • 更正自己:“遵循 303 需要将方法重写为 GET,除非初始方法是 HEAD”。
    • Piotr:默认应该是not来修改方法;资源移动了,这不会影响如何操作它。 303是一个例外;这并不意味着“资源已移动”,而是“请求已处理,这是您的结果”;这是一种完全不同类型的重定向。见greenbytes.de/tech/webdav/…
    • 由于@BobAman 拒绝将 JulianReschke 的更正整合到他的答案中,我介入整合它。顺便说一句,我仍然认为 GolezTrol 的回答更准确(stackoverflow.com/a/4764473/19163)。不幸的是,他的答案从未赶上成为最佳答案,因此我决定除了支持更好的答案之外,还修复了更差的答案。
    【解决方案2】:

    303和307的区别是这样的:

    303:见其他。请求被正确接收,但应使用重定向 url 上的 GET 检索结果。

    307:临时重定向。整个请求应该被重定向到新的 url。任何发布的数据都应该重新发布。

    请注意,302 旨在具有 307 的行为,但大多数浏览器将其实现为 303 的行为(两者当时都不存在)。因此,引入了这两个新代码来代替 302。

    301和303的区别:

    301:文档被移动。未来的请求应该使用新的 url。此网址已过时。

    注意:请小心使用此代码。浏览器和代理往往会对其应用非常积极的缓存,因此如果您回复 301,则可能需要很长时间才能有人重新访问该网址。

    303:请求被正确接收。处理任何 PUT 请求。 生成的文档可以从重定向 url 中检索。未来的请求仍应转到原始 url。

    【讨论】:

    • 一篇介绍 3xx 细节(以及它的所有问题)的好博文位于:insanecoding.blogspot.no/2014/02/…
    • @skeller88 您的更改使我的答案不正确,因此我将其还原(对接受更改的人嘘)!您引入了与接受的答案相同的错误。 303 是一种不同类型的重定向,适用不同的规则,正如 Julian Reschke 的 cmets 在接受的答案和 arcuri82 链接的博客中所证实的那样
    • 我比接受的答案更喜欢这个答案,因为它明确指出为什么引入了两个新代码(303 和 307),而不是只引入一个(这似乎更合乎逻辑我),除了已经存在的 302 之外还保留了 HTTP 方法,但没有。实际上 302 在大多数浏览器中的工作方式与 303 完全相同。但这与规范相矛盾,这就是引入 303 的原因。这意味着根本不应该使用 302,因为虽然大多数软件客户端都像 303 一样实现它,但有些软件客户端可能会遵循具有讽刺意味的是违反“预期”行为的规范。
    • 另一方面,一些老客户可以忽略 303 和 307,只在收到 301/302 时进行重定向,因为他们不知道 303/307 是什么(在 2k20 中我认为很难找到这样的http客户端)。因此,使用哪种代码(302 或 303)来创建“GET”重定向的建议主要取决于预期的 http 客户端。
    • @RuslanStelmachenko 谢谢!虽然理论上老客户端总是令人担忧,但这些状态代码是在 1999 年随 HTTP 1.1 引入的,当时微软的 Internet Explorer 5 刚刚超过 Netscape 获得了一些市场份额,比第一个 Firefox 和 Chrome 发布早几年。显然是some bots say they are on HTTP 1.0,但这并不意味着他们不会响应这些状态代码。但是,是的,最好保持在最低限度,以防您看到响应这些状态的奇怪行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2010-12-09
    • 1970-01-01
    • 2017-06-28
    • 2012-01-28
    • 2011-01-07
    相关资源
    最近更新 更多