我有我的Angularjs网站,我正在尝试将所有Http
流量路由到Https
,为此,我写了下面的代码,但每次打开我的网站时它都无效Http
重定向未发生。
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/public')); // Website part added
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }))
app.use(function(req,res,next) {
if(req.headers["x-forwarded-proto"] == "http") {
res.redirect("https://" + req.headers.host + req.url);
return next();
} else {
console.log('Request was not HTTP');
return next();
}
});
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.get('*', function(req, res) {
res.sendFile(__dirname + '/public/index.html');
});
任何人都可以告诉我为什么这不起作用?
修改 - 我注意到每当我打开我的网站时,most of the times
这个中间件都是not getting called
。怎么可能呢?
修改 - 我的base href="/"
中设置了index.html
,这会导致任何问题。
答案 0 :(得分:1)
你好我实际上犯的错误是我在设置redirecting
目录后将/public
放在中间件上,但正确的方法是在设置/public
目录之前放置它。
正确代码
app.use(function(req,res,next) {
if(req.headers["x-forwarded-proto"] == "http") {
res.redirect("https://" + req.headers.host + req.url);
return next();
} else {
console.log('Request was not HTTP');
return next();
}
});
app.use(express.static(__dirname + '/public')); // Website part added
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }))
由于Https没有执行,但现在一切都按预期工作。
答案 1 :(得分:0)
这是因为在所有情况下都不能依赖x-forwarded-proto
标头。
x-forwarded-proto
通常是在代理后面运行您的应用时设置的,显然不是您的情况。
最好使用req.protocol
代替:
if (req.protocol === "http") {
res.redirect("https://" + req.headers.host + req.url);
} else {
console.log('Request was not HTTP');
return next();
}
或者您可以使用方便的 Express 请求属性req.secure。