17

我最近尝试在 node/express 服务器上设置 HTTPS。我已经成功地使用以下代码重定向所有路由以使用 https:

// force https redirect
var https_redirect = function(req, res, next) {
  if (req.secure) {
    if(env === 'development') {
      return res.redirect('https://localhost:3000' + req.url);
    } else {
      return res.redirect('https://' + req.headers.host + req.url);
    }
  } else {
    return next();
  }
};

app.get('*', function(req, res, next) {
  https_redirect(req, res, next);
});

这似乎工作正常。但是,由于在我有几个问题之前我还没有涉足这个问题:

  1. 这是从 http 重定向到 https 的理想方式吗?
  2. 如果用户使用 http 路由,那么在重定向之前,任何人都可以使用 sslstrip 之类的东西来嗅探会话信息。

节点:v0.8.2;快递:v3.05

4

3 回答 3

43
function requireHTTPS(req, res, next) {
    if (!req.secure) {
        //FYI this should work for local development as well
        return res.redirect('https://' + req.get('host') + req.url);
    }
    next();
}

app.use(requireHTTPS);
app.get('/', routeHandlerHome);

中间件方法将起作用,因为 express 将在运行路由器之前按添加的顺序运行中间件,并且通常这种站点范围的策略作为中间件与通配符路由相比更干净。

关于关于嗅探会话 cookie 的问题 2,必须通过将 cookie 标记为secure设置它们时来解决。如果它们没有被标记为安全,浏览器也会将它们与 HTTP 请求一起传输,从而使它们暴露在嗅探之下。

于 2013-04-05T07:28:47.930 回答
2

您可以简单地使用您的 https_redirect 函数(尽管稍作修改)来自动重定向所有安全请求:

// force https redirect
var https_redirect = function () {
  return function(req, res, next) {
    if (req.secure) {
      if(env === 'development') {
        return res.redirect('https://localhost:3000' + req.url);
      } else {
        return res.redirect('https://' + req.headers.host + req.url);
      }
    } else {
      return next();
    }
  };
};
app.use(https_redirect());

app.get('/', routeHandlerHome);
于 2013-04-04T15:21:52.050 回答
0

我使用这个简单的代码来重定向请求,具体取决于应用程序是处于开发阶段还是生产阶段。

// force https redirect
var forceHTTPS = function () {
  return function(req, res, next) {
    if (!req.secure) {
      if (app.get('env') === 'development') {
         return res.redirect('https://localhost:3001' + req.url);
      } else {
        return res.redirect('https://' + req.headers.host + req.url);
      }
    } else {
      return next();
    }
  };
};
于 2015-12-14T21:08:18.307 回答