我正在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()
}
})
但这没有帮助。有什么解决办法的想法吗?
答案 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"
}
}
}