使用Express 3重定向所有请求?

时间:2012-08-24 20:33:39

标签: node.js express connect

这样做的最佳方式是什么?

我想将所有请求从www.mysite.com重定向到mysite.com

*.mysite.commysite.com是理想的

我会想到某种类型的中间件。我仍然讨厌这个,因为它似乎不那么优雅而且有点浪费,但我认为我唯一的选择就是做这个服务器端。

1 个答案:

答案 0 :(得分:9)

由于Express 3不使用自己的HTTP服务器(而是将您的应用程序传递给http.createServer),因此除非您告诉它,否则它不知道它正在运行什么端口。也就是说,您基本上可以使用以下内容执行操作:

app.use(function(request, response, next) {
  var newHost = request.host.replace(/^www\./, '');
  if (request.host != newHost) {
    // 301 is a "Moved Permanently" redirect.
    response.redirect(301, request.protocol + "://" + newHost + request.url);
  } else {
    next();
  }
});

您可以将其导出到模块中并将其包装在带有端口的生成器中:

// no_www.js

module.exports = function(port) {
  app.use(function(request, response, next) {
    var newHost = request.host.replace(/^www\./, '');
    if (request.host != newHost) {
      var portStr = '';
      if (request.protocol == 'http' && port != 80) portStr = ':' + port;
      if (request.protocol == 'https' && port != 443) portSt r= ':' + port;
      // 301 is a "Moved Permanently" redirect.
      response.redirect(301, request.protocol + "://" + newHost + portStr + request.url);
    } else {
      next();
    }
  });
}

// app.js

var noWww = require('./no_www');
var app = express();

app.configure("development", function() {
  app.set("port", 3000);
});

...

app.use(noWww(app.get('port')));