Несмотря на то, что этому вопросу уже почти 3 года, есть несколько тонких проблем с ранее опубликованными ответами (и их комментариями), а также несколько полезных советов в комментариях, которые не вернули сами ответы. , Вот несколько важных вещей, на которые стоит обратить внимание:
- Не указывайте
http://
или https://
в URI перенаправления; это делает жизнь отстойной при переключении между средами разработки и разработки - вместо этого используйте req.protocol
.
- Также обратите внимание, что для надежного использования
req.protocol
за прокси-сервером, выполняющим SSL-завершение (например, Elastic Load Balancer), необходимо убедиться, что параметр trust proxy
включен. Это гарантирует, что req.protocol
вернет протокол, который видит браузер, а не протокол, который окончательно добрался до вашего сервера приложений.
- Принятый ответ имеет логическую ошибку, так как он совпадает с
/^www/
, но форматирует URI перенаправления с /^www./
. На практике это, вероятно, никого не укусит, но это приведет к бесконечным циклам перенаправления для чего-то вроде wwwgotcha.example.com
.
- Обязательно используйте
req.headers.host
вместо req.host
, так как последний удаляет номер порта. Таким образом, если бы вы обрабатывали запрос на www.example.com:3000
, вы бы перенаправили пользователя на www.example.com
, минус правильный номер порта.
- Как указал Дарио , вы, как правило, захотите использовать редирект 301 при переходе с www на non-www (или наоборот) для целей SEO.
- Последняя проблема является самой незначительной, но обычно безопаснее использовать
req.originalUrl
при создании URI перенаправления, на случай, если вы работаете в смонтированном «вспомогательном приложении».
С учетом всего вышесказанного, мой рекомендуемый подход, который учитывает вышеизложенное:
function wwwRedirect(req, res, next) {
if (req.headers.host.slice(0, 4) === 'www.') {
var newHost = req.headers.host.slice(4);
return res.redirect(301, req.protocol + '://' + newHost + req.originalUrl);
}
next();
};
app.set('trust proxy', true);
app.use(wwwRedirect);