【问题标题】:Redirect all requests using Express 3?使用 Express 3 重定向所有请求?
【发布时间】:2012-08-20 10:07:48
【问题描述】:

最好的方法是什么?

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

*.mysite.commysite.com 将是理想的

我认为某种类型的中间件。我仍然讨厌这个,因为它看起来很不优雅而且有点浪费,但我认为我唯一的选择是在服务器端做这个。

【问题讨论】:

  • 你可以在你的服务器配置中解决这个问题。你在什么上运行节点? Nginx?阿帕奇?
  • @leemachin 就像标签说的那样,我正在使用 Express(它使用 Connect)
  • 那么你的不优雅的根源不是把它放在代理后面(比如 Nginx 或 Apache)。
  • 我不需要代理。此外,代理会做同样的事情并且同样不雅。不优雅是我必须处理的事情,我只需要知道如何在这些中进行全局重定向。我不想和你争论是否使用代理。

标签: node.js express connect


【解决方案1】:

由于 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')));

【讨论】:

  • 太棒了。这正是我所需要的。 .use() 不在 Express 文档中,所以我不确定它做了什么。我假设它是在每个请求上执行的函数的包装器?
  • 很不幸,当新站点升级到版本 3 时,use 的文档似乎丢失了。你是对的,use 暴露了 Connect 的(Express 是基于 Connect 构建的)中间件系统,所以我上面写的那个 no-www 模块是 Connect/Express 的中间件。查看senchalabs.org/connect 了解更多信息。
  • 这就是我搜索 Express 4 的答案。我唯一需要的是 response.redirect(statusCode, destination);不幸的是,它的行为非常奇怪。我给了它一个完整的 url,而不是重定向到 url,而是将 url 附加到当前路径的末尾。我通过重定向到“/”解决了这个问题,在这种情况下,这是我想要的目的地,但是如果我不得不重定向到另一个域,我必须弄清楚我做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2015-04-10
  • 2018-05-02
  • 1970-01-01
  • 2013-02-15
  • 2016-10-23
相关资源
最近更新 更多