我正在使用快递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相同)?
答案 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)