Подтвердить что ты не робот

Node.js www - перенаправление без WWW

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

4b9b3361

Ответ 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);