发回新位置标头的方法存在一些细微差别。
与redirect:
app.get('/foobar', function (req, res) {
res.redirect(401, '/foo');
});
// Responds with
HTTP/1.1 401 Unauthorized
X-Powered-By: Express
Location: /foo
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 33
Date: Tue, 07 Apr 2015 01:25:17 GMT
Connection: keep-alive
Unauthorized. Redirecting to /foo
使用status 和location:
app.get('/foobar', function (req, res) {
res.status(401).location('/foo').end();
});
// Responds with
HTTP/1.1 401 Unauthorized
X-Powered-By: Express
Location: /foo
Date: Tue, 07 Apr 2015 01:30:45 GMT
Connection: keep-alive
Transfer-Encoding: chunked
使用redirect 的原始(不正确)方法:
app.get('/foobar', function (req, res) {
res.status(401).redirect('/foo')();
});
// Responds with
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Express
Location: /foo
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 38
Date: Tue, 07 Apr 2015 01:26:38 GMT
Connection: keep-alive
Moved Temporarily. Redirecting to /foo
所以看起来redirect 将放弃任何以前的状态代码并发送默认值(除非在方法调用中指定)。这是有道理的,因为在 Express 中使用了中间件。如果您有一些全局中间件对所有请求进行预检查(例如检查正确的接受标头等),他们将不知道重定向请求。但是,身份验证中间件会,因此它会知道覆盖任何以前的设置以正确设置它们。
更新:正如下面的 cmets 所述,即使 Express 可以发送带有 Location 标头的 4XX 状态代码,但这并不意味着它是请求客户端根据规范理解的可接受响应。事实上,除非状态码是 3XX 值,否则大多数人都会忽略 Location 标头。