Ответ 1
Есть несколько тонких различий в методах отправки нового заголовка местоположения.
С 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
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. Если у вас было какое-то глобальное промежуточное программное обеспечение, выполняющее предварительную проверку всех запросов (например, проверка правильности принятых заголовков и т.д.), Они не знали бы перенаправить запрос. Однако промежуточное ПО аутентификации будет и, следовательно, будет знать, чтобы переопределить любые предыдущие настройки, чтобы правильно их установить.
ОБНОВЛЕНИЕ: Как указано в комментариях ниже, даже несмотря на то, что Express может отправлять код состояния 4XX с заголовком Location, это не означает, что это приемлемый ответ для клиента запроса, чтобы понять его в соответствии со спецификациями. Фактически большинство игнорирует заголовок Location, если код состояния не является значением 3XX.