Node.js www - без www перенаправление - PullRequest
34 голосов
/ 10 августа 2011

Есть ли возможность каким-либо образом перенаправить www на URL без www в файле node.js? Поскольку в веб-сервере узла нет htaccess, мне интересно, как это сделать.

Ответы [ 5 ]

74 голосов
/ 23 мая 2014

Несмотря на то, что этому вопросу уже почти 3 года, есть несколько тонких проблем с ранее опубликованными ответами (и их комментариями), а также несколько полезных советов в комментариях, которые не вернули сами ответы. , Вот несколько важных вещей, на которые стоит обратить внимание:

  1. Не указывайте http:// или https:// в URI перенаправления; это делает жизнь отстойной при переключении между средами разработки и разработки - вместо этого используйте req.protocol.
  2. Также обратите внимание, что для надежного использования req.protocol за прокси-сервером, выполняющим SSL-завершение (например, Elastic Load Balancer), необходимо убедиться, что параметр trust proxy включен. Это гарантирует, что req.protocol вернет протокол, который видит браузер, а не протокол, который окончательно добрался до вашего сервера приложений.
  3. Принятый ответ имеет логическую ошибку, так как он совпадает с /^www/, но форматирует URI перенаправления с /^www./. На практике это, вероятно, никого не укусит, но это приведет к бесконечным циклам перенаправления для чего-то вроде wwwgotcha.example.com.
  4. Обязательно используйте req.headers.host вместо req.host, так как последний удаляет номер порта. Таким образом, если бы вы обрабатывали запрос на www.example.com:3000, вы бы перенаправили пользователя на www.example.com, минус правильный номер порта.
  5. Как указал Дарио , вы, как правило, захотите использовать редирект 301 при переходе с www на non-www (или наоборот) для целей SEO.
  6. Последняя проблема является самой незначительной, но обычно безопаснее использовать 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);
28 голосов
/ 10 августа 2011

Вы используете экспресс, верно? Если это так, вы можете создать обработчик маршрута, через который будут проходить все запросы GET, проверять, относятся ли они к URL-адресу 'www', и перенаправлять на соответствующий URL-адрес, не принадлежащий www.

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();     
  }
})
4 голосов
/ 10 августа 2011

Это основной пример того, как вы можете имитировать поведение директивы перенаправления apache в nodejs.

Функция перенаправления принимает либо 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');
1 голос
/ 03 октября 2017

В мире DevOps и растущем внедрении хостинговых платформ этот тип вещей никогда не должен обрабатываться кодом. Вы должны обрабатывать перенаправление, используя инфраструктуру. Внедрение этого кода в приложение означает, что команда операций не может решить проблемы в случае сбоя в записи apex. Кроме того, хотя это модно, блестяще и модно, использование апекса в качестве URL-адреса вашего сайта ограничивает возможность операций перенаправления сайта в случае сбоя и вызывает проблемы, когда вы хотите провести сине-зеленое, A / B-тестирование или гео-перенаправление (в некоторых случаях). Ваш код и приложение должны быть независимыми от URL.

0 голосов
/ 28 октября 2013

Я согласен с Себастьяном, приведенным выше, с небольшим изменением, и если вы используете 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...