Node / express - 如何强制HTTPS而不被CORS

时间:2017-03-10 14:28:35

标签: node.js express heroku https

我正在使用Cloud9和Heroku开发基于MEAN堆栈的Web应用程序。我希望所有用户都被迫使用HTTPS,我发现使用Express中间件的方式很好:

app.use(function(req,res,next) {
    if(req.headers["x-forwarded-proto"] == "http") {
      console.log("HTTP call detected, not allowed);
      return res.redirect('https://' + req.hostname + req.path);
    } else {
      console.log("HTTPs call detected, allowed");
        return next();
    } 

我希望这可以适用于我收到的所有GET,POST,PUT,DELETE请求,认为对HTTP的任何调用都应该被重定向到相同的相应HTTPS请求。

现在虽然这本身似乎有效,但我收到了CORS政策错误

  

XMLHttpRequest无法加载   https://myappurlhere.herokuapp.com/app。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。来源'http://myappurlhere.herokuapp.com'是   因此不允许访问。响应的HTTP状态代码为401。

现在我理解这是防止跨域请求的标准CORS策略的概念,但我不确定如何处理这个问题。我认为这将是一个相同的域请求,但显然不是。

我看到有些人认为第二台服务器应该运行并捕获HTTP流量,重定向,但我只使用一台服务器。我不明白为什么那不起作用。

非常感谢任何帮助。

此致

2 个答案:

答案 0 :(得分:0)

function requireHTTPS(req, res, next) {
   if (!req.secure) {
          return res.redirect('https://' + req.get('host') + req.url);
    }
        next();
}
app.use(requireHTTPS);

这对我有用。

答案 1 :(得分:0)

我现在强制使用HTTPS流量,但我认为我没有解决实际问题。我现在使用的是:

app.use(function (req, res, next) {
    res.setHeader('Strict-Transport-Security', 'max-age=8640000; includeSubDomains');
    if (req.headers['x-forwarded-proto'] && req.headers['x-forwarded-proto'] === "http") {
      return res.redirect(301, 'https://' + req.host + req.url);
    } else {
      console.log("HTTPS call detected");
      return next();
    }
});

这似乎有效地强制严格的TLS,可能是因为标题更改。然而,这也意味着重定向似乎永远不会发生 - 测试" http"总是假的。因此,COTS重定向策略的问题仍然存在。

这是我真正想要的一些输入 - 我应该添加一些允许跨域请求的策略吗?这听起来不安全,为什么?我在同一个域名,我只想要HTTPS。

任何意见都赞赏。

相关问题