为什么POST重定向到GET和PUT重定向到PUT?

时间:2015-10-19 12:43:21

标签: node.js http express

我正在使用快递4.13.3(最新)和以下代码:

var express = require('express')

var app = express()

app.get('/test', function (req, res, next) {
  res.send('hello!')
})

app.post('/test', function (req, res, next) {
  res.redirect('/test')
})

app.put('/test', function (req, res, next) {
  res.redirect('/test')
})

app.listen(5001)

// GET /test -> 'hello!'
// POST /test -> 'hello!'
// PUT /test -> ERR_TOO_MANY_REDIRECTS

POST重定向到GET,但PUT重定向到PUT。是否可以使PUT重定向到GET(与POST相同)?

3 个答案:

答案 0 :(得分:10)

首先,让我们了解res.redirect does

  

res.redirect([状态,]路径)

     

使用指定的HTTP状态代码状态重定向到从指定路径派生的URL。如果您未指定状态,则状态代码默认为“302”Found“。

如果我们查看HTTP 1.1 spec for a 302 response,我们会看到

  

注意:由于历史原因,用户代理可以更改请求         从POST到GET的方法,用于后续请求。如果这         行为是不受欢迎的,307(临时重定向)状态代码         可以改为使用。

307请求将在所有情况下保留HTTP动词,但这不是您想要的。您希望动词更改为GET。在这种情况下,您需要303

  

303见其他

     

303(请参阅其他)状态代码表示服务器是      将用户代理重定向到不同的资源,如a所示      Location头字段中的URI,用于提供      对原始请求的间接响应。用户代理可以执行      针对该URI的检索请求(如果是,则为 GET或HEAD请求)      使用HTTP ),它也可能被重定向,并呈现最终      结果作为原始请求的答案。

303响应将提示客户端(前提是它理解HTTP 1.1)以对指定资源执行GET请求。因此,只需在重定向中提供303状态代码:

res.redirect(303, '/test')

答案 1 :(得分:9)

在深入了解详情之前,下面是解决问题的方法之一:

app.put('/test', function(req, res, next) {
    res.redirect(303, '/test') // Notice the 303 parameter
})

默认情况下,Express使用HTTP代码302进行重定向。根据{{​​3}},这可以防止POST / PUT请求被重定向为POST / PUT请求并解释您在代码中观察到的内容:

  

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

另一方面,如果您使用303重定向,则允许将POST / PUT请求重定向为POST / PUT请求,如HTTP specification中所述:

  

303:重定向未定义的原因。通常,'操作有   完成,继续在其他地方。“客户提出后续请求   此资源不应使用新URI。客户应该遵循   重定向POST / PUT / DELETE请求。

答案 2 :(得分:1)

put的方式是正确的,你将请求重定向到另一个位置,但http方法是相同的。这就是为什么它试图再次访问put(你没有改变http方法。)

  

为什么post重定向到get

这是answer