我正在使用express 4.13.3(最新)和以下代码:
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相同)?
在详细讨论之前,下面是解决问题的一种方法:
app.put('/test', function(req, res, next) { res.redirect(303, '/test') // Notice the 303 parameter })
默认情况下,Express使用HTTP代码302进行重定向。根据HTTP规范,这可以防止POST / PUT请求被重定向为POST / PUT请求,并解释了您在代码中观察到的内容:
如果响应GET或HEAD以外的请求而接收到302状态码,则用户代理不得自动重定向该请求,除非用户可以确认,因为这可能会更改发出该请求的条件。 303:由于未定义的原因重定向。通常,“操作已完成,请在其他位置继续。” 对此资源进行后续请求的客户端不应使用新的URI。客户端应遵循POST / PUT / DELETE请求的重定向。
如果响应GET或HEAD以外的请求而接收到302状态码,则用户代理不得自动重定向该请求,除非用户可以确认,因为这可能会更改发出该请求的条件。
303:由于未定义的原因重定向。通常,“操作已完成,请在其他位置继续。” 对此资源进行后续请求的客户端不应使用新的URI。客户端应遵循POST / PUT / DELETE请求的重定向。