哪个是重定向的正确HTTP响应代码?

时间:2011-07-02 01:06:37

标签: http webserver http-status-codes

当Web服务器希望重定向用户的浏览器时,应将哪个状态代码(即“200 OK”)放在响应头中?根据我的阅读,似乎答案可能是任何一个3XX代码,但这些代码中的每一个似乎都有不同的描述。只要“位置”在响应头中,使用哪个甚至是否重要?

4 个答案:

答案 0 :(得分:1)

这完全取决于你为什么要进行重定向。我假设您已阅读RFC 2616

除了可能用于页面重命名之类的内容之外,您不想使用301。我不知道任何CMS会自动执行此操作。

  

具有链接编辑功能的客户端应该自动进行      将对Request-URI的引用重新链接到一个或多个新的      尽可能在服务器返回的引用。

302对于临时GET-after-GET来说非常好,默认情况下是不可缓存的。它不应该用于GET-after-POST,因为它实际上意味着POST后POST(在询问用户确认之后):

  

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

303用于GET-after-POST。古代浏览器可能不支持它,因此您可能不希望将它用于GET-after-GET:

  

注意:许多pre-HTTP / 1.1用户代理不理解303         状态。当与这样的客户端的互操作性是一个问题时,         因为大多数用户代理会做出反应,所以可以使用302状态代码         如此处针对303所述的302响应。

307用于POST后(在与用户确认之后)。它可用于GET-after-GET,但在这种情况下你也可以使用302/303:

  

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

至于兼容性,如果有相当大比例(1%?)的用户落后于不理解303或307的破解代理,即使他们声称支持HTTP / 1.1,我也不会感到惊讶。 MEH。

答案 1 :(得分:1)

为我节省了大量的打字费用 - read thisthis

注意 - 并非所有3xx代码都进行重定向。但301,302,303和307的语义是相似的。

答案 2 :(得分:0)

根据the Mozilla docs

  

重定向响应(表单的重定向)   3xx)表明资源即   客户要求已移动和   服务器无法提供服务   直。大多数这些回应   包含一些位置信息   告诉在哪里找到所要求的   资源;经常是用户代理   无需其他用户即可检索它   相互作用。最常见的回应   这种类型的是301 Moved Permanently,   表明给定的URI是否   更长的有效期并已移至   另一个地方,302 Found   表示资源有   被暂时转移到另一个   的地方。

     

注意:对于网站管理员,建议在设置301 Moved Permanently重定向时   在a期间将页面移动到另一个URI   例如,网站重组。那   允许用户关注链接   到达资源,它也教导   搜索引擎和其他服务   资源的新位置,这样   他们可以将元数据转移到   它。添加也很重要   足够的缓存标头到301 Moved Permanently响应所以   这个信息是由缓存的   客户并阻止它制作   对原件的不必要的请求   获取资源之前的URI   本身。

有关状态代码的更多详细信息,请参阅the W3C。有关不同状态代码如何影响SEO的直观表示,请参阅SEO Guide to HTTP Status Codes

答案 3 :(得分:0)

响应代码302.或者至少,这是Java HttpServletResponse在您拨打sendRedirect()时发送的内容。如果Java就是这样做的,那可能就有原因。

301和302之间在语义上的唯一区别是301表示“永久重定向”,302表示“临时重定向”。这是否会转化为实践中的任何差异完全取决于客户端实施协议。

例如,浏览器可以决定,因为301是永久性的,它只会记住它返回的重定向URL,而不再实际发送原始URL的请求。但这完全取决于浏览器的实现。

也许一个合理的经验法则是,如果要将静态内容移动到新位置,请始终使用301.但是,如果您要发送重定向以响应对服务器上某些动态代码的请求,那么您应该使用代码302(或者替代地,307),以确保后续请求仍然发送到原始URL,以防您决定更改/更新动态代码以执行不同的操作。