Node.js Node/express-如何在不被CORS阻止的情况下强制HTTPS

Node.js Node/express-如何在不被CORS阻止的情况下强制HTTPS,node.js,express,heroku,https,Node.js,Express,Heroku,Https,我正在使用Cloud9和Heroku开发一个基于平均堆栈的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

我正在使用Cloud9和Heroku开发一个基于平均堆栈的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 . 不 “Access Control Allow Origin”标头出现在请求的服务器上 资源。来源“”是 因此不允许访问。响应的HTTP状态代码为401

现在我确实理解了这样一个概念,即这是防止跨域请求的标准CORS策略,但我不确定应该如何处理这一点。我认为这将作为一个相同的域请求,但显然不是

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

非常感谢您的帮助

问候

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


这对我很有效。

我现在强制使用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


任何输入都值得赞赏。

我现在强制使用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

欢迎您的任何意见