Есть ли возможность каким-либо образом перенаправить www к URL-адресам, отличным от www, в node.js? Поскольку в веб-сервере node нет htaccess, мне любопытно, как это сделать.
Node.js www - перенаправление без WWW
Ответ 1
Вы используете экспресс, не так ли? Если это так, вы можете сделать обработчик маршрута, через который проходят все запросы GET, проверяет, соответствует ли он URL-адресу www и перенаправляет на соответствующий URL-адрес, если это необходимо.
app.get('/*', function(req, res, next) {
if (req.headers.host.match(/^www/) !== null ) {
res.redirect('http://' + req.headers.host.replace(/^www\./, '') + req.url);
} else {
next();
}
})
Ответ 2
Несмотря на то, что этот вопрос составляет почти 3 года, есть несколько тонких проблем с ранее опубликованными ответами (и их комментариями), а также некоторые полезные советы в комментариях, которые не вернули его самим ответам, Вот несколько важных замечаний:
- Не перегружайте
http://
илиhttps://
в URI перенаправления; это заставляет жизнь сосать при переключении между средами dev и prod - вместо этого используйте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
, за вычетом правильного номера порта. - Как отметил Dário, вы обычно захотите использовать перенаправление 301 при переходе от www к не-www (или наоборот) для целей SEO.
- Последняя проблема является самой незначительной, но при создании редиректных URI, как правило, безопаснее использовать
req.originalUrl
, на случай, если вы работаете в подключенном "вспомогательном приложении".
Все, что сказано, здесь мой рекомендуемый подход, который учитывает это:
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);
Ответ 3
Это основной пример того, как вы могли бы имитировать поведение директивы redirect для apache в nodejs.
Функция redirect принимает либо RegExp, либо строку.
var http, redirect;
http = require("http");
redirect = function(host, res, pattern, redirect){
if (host == pattern || (pattern instanceof RegExp && host.match(pattern))) {
console.log("Redirected " + host);
res.writeHead(302, {
'location': redirect
});
res.end();
}};
http.createServer(function(req, res){
redirect(req.headers.host, res, /^www/, 'http://plouf.url');
redirect(req.headers.host, res, 'www.plouf.url', 'http://plouf.url');
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
}).listen(8000, '127.0.0.1');
Ответ 4
В мире DevOps и растущем внедрении размещенных платформ этот тип вещей никогда не должен обрабатываться кодом. Вместо этого вы должны обрабатывать перенаправление с использованием инфраструктуры. Ввод этого кода в приложение означает, что проблемы не могут быть устранены командой Operations, если что-то не вступает в запись вершины. Кроме того, в то время как это фантазия и блеск и бедро, используя вершину, поскольку ваш URL-адрес сайта ограничивает способность Операций перенаправлять сайт, если что-то пойдет не так и вызывает проблемы, когда вы хотите выполнить сине-зеленый, A/B-тестирование или гео-перенаправление (в некоторых случаях). Ваш код и приложение должны быть URL-агностиками.
Ответ 5
Я согласен с Себастьяном выше с небольшим изменением, и если вы используете Express. Я бы просто сделал это промежуточным программным обеспечением, которое будет обработано по всем запросам.
function removeWWW(req, res, next){
if (req.headers.host.match(/^www/) !== null ) {
res.redirect('http://' + req.headers.host.replace(/^www\./, '') + req.url);
} else {
next();
}
}
app.use(removeWWW);