【问题标题】:Heroku nodejs- redirect HTTP to HTTPSHeroku nodejs- 将 HTTP 重定向到 HTTPS
【发布时间】:2018-07-08 16:33:33
【问题描述】:

我正在使用 Progressive Web App 并在使用 Lighthouse 进行测试时得到:

不将 HTTP 流量重定向到 HTTPS

我的服务器在 nodejs 中,它在 Heroku 上。我试图添加这段代码:

app.get('*',function(req,res,next){
  if(req.headers['x-forwarded-proto']!='https'){
    res.redirect(`https://${req.header('host')}${req.url}`)
  }else{
    next()
  }
})

但这并没有帮助。任何想法如何解决这个问题?

【问题讨论】:

  • 是的。然而它没有帮助。我需要在前端进行更改。
  • 不是一个好主意,请参阅我对您的回答的评论以及我的回答。

标签: node.js progressive-web-apps


【解决方案1】:

您想在服务器上强制执行此操作,最简单的方法是使用express-sslify 模块。来自文件:

var express = require('express');
var http = require('http');
var enforce = require('express-sslify');

var app = express();

// Use enforce.HTTPS({ trustProtoHeader: true }) since you're behind Heroku's reverse proxy
app.use(enforce.HTTPS({ trustProtoHeader: true }));

// The rest of your express config.

还请注意,您希望像我一样使用 app.use(),而不是像您那样使用 app.get(),以确保您覆盖应用的所有请求,而不仅仅是 GET .

【讨论】:

    【解决方案2】:

    监听 80 端口并重定向到 https

    var http = require('http');
    var server = http.createServer((req, res) => {
      res.writeHead(301,{Location: `https://${req.headers.host}${req.url}`});
      res.end();
    });
    
    server.listen(80);
    

    【讨论】:

    • 我正在使用 express,但我不知道如何将您的代码与我当前的代码连接起来:var server = require('http').Server(app);
    • 这段代码在端口 80 上监听 http 请求。之后,您必须使用 express 侦听端口 443 (https),​​您可以在其中为您的 webapp 提供服务。 var https = require('https'); # 您必须从存储它们的位置读取 privateKey 和证书 var options = {key: privateKey, cert: certificate}; var httpsServer = https.createServer(options, app);
    【解决方案3】:

    为什么不检查req.protocol

    app.get('*',function(req,res,next){
      if(req.protocol !== 'https'){
        res.redirect(`https://${req.header('host')}${req.url}`)
      }else{
        next()
      }
    })
    

    【讨论】:

      【解决方案4】:

      我一直在使用的另一个没有明显缺点的解决方案是使用节点包ssl-express-www,假设您使用的是看起来像您的 Express。

      代码极其简单:

      先安装包npm i ssl-express-www

      然后在你的服务器文件中:

      const secure = require("ssl-express-www")
      
      const app = express();
      
      app.use(secure)
      

      就是这样!将该代码放在路由处理程序之前的顶部,它将为您完成所有“繁重的工作”。

      【讨论】:

        【解决方案5】:

        我找到了解决方案。当我使用 React 时,我刚刚在客户端创建了文件,在主文件夹中名为 static.json,并添加了:

        {
         "root": "build/",
          "https_only": true,
          "headers": {
            "/**": {
              "Strict-Transport-Security": "max-age=7776000"
            }
          }
        }
        

        【讨论】:

        • 不是一个好主意。这将允许恶意中间人简单地为您的客户端提供略微修改的版本。您真的想在服务器上强制执行此操作。
        • 我已联系 Heroku 开发团队,这是他们建议的解决方案。
        • 这并没有让我感觉更好。
        猜你喜欢
        • 2011-11-03
        • 2021-01-01
        • 2013-02-13
        • 2018-05-12
        • 2021-08-31
        • 2014-05-14
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多