Heroku Node.js-将HTTP重定向到HTTPS

时间:2018-07-08 16:33:34

标签: node.js progressive-web-apps

我正在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()
  }
})

但这没有帮助。有什么解决办法的想法吗?

5 个答案:

答案 0 :(得分:3)

您要在服务器上实施此操作,最简单的方法是使用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(),以确保满足应用程序的 all 请求,而不仅仅是GET。

答案 1 :(得分:1)

在端口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);

答案 2 :(得分:1)

为什么不勾选req.protocol

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

答案 3 :(得分:0)

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

代码极其简单:

首先安装包npm i ssl-express-www

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

const secure = require("ssl-express-www")

const app = express();

app.use(secure)

原来如此!将该代码放在您的路由处理程序之前的顶部,它会为您完成所有“繁重工作”。

答案 4 :(得分:-1)

我找到了解决方案。在使用React时,我只是在客户端创建了一个文件,在主文件夹中名为static.json,并添加了以下内容:

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