我正在尝试在我的快递应用中将http (80)
重新路由到https (443)
。我正在使用一些中间件来做到这一点。如果我去https://my-example-domain.com
,一切都很好。但如果我转到http://my-example-domain.com
,它就不会重定向,也不会显示任何内容。
我也在我的ubuntu服务器上设置了一些iptables
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 8443 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8443
function requireHTTPS(req, res, next) {
if (!req.secure) {
return res.redirect('https://' + req.headers.host + req.url);
}
next();
}
// all environments
app.set('port', process.env.PORT || 8443);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.logger('dev'));
app.use(requireHTTPS); // redirect to https
app.use(express.json());
app.use(express.urlencoded());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.get('/', function(req, res){
res.render('index');
})
https.createServer(options, app).listen(8443);
所以我的问题是我只需要添加另一个iptables
规则吗?或者我是否需要在我的应用中配置某些内容?
基于下面的一个答案,我不认为它是一个中间件问题,而是一个端口问题。例如:如果我转到http://my-example-domain.com,则无效。但是如果我添加端口8443 http://my-example-domain.com:8443,它会重定向。
答案 0 :(得分:6)
var redirectApp = express () ,
redirectServer = http.createServer(redirectApp);
redirectApp.use(function requireHTTPS(req, res, next) {
if (!req.secure) {
return res.redirect('https://' + req.headers.host + req.url);
}
next();
})
redirectServer.listen(8080);
答案 1 :(得分:4)
您只需要在快递应用中同时收听http和https。然后包括中间件,如果不安全则重新路由。然后添加iptable以重新路由443 => 8443.完成。
答案 2 :(得分:1)
这应该有用。
app.use(function(req,resp,next){
if (req.headers['x-forwarded-proto'] == 'http') {
return resp.redirect(301, 'https://' + req.headers.host + '/');
} else {
return next();
}
});
答案 3 :(得分:0)
我正在使用类似的解决方案,其中我还添加了'www',因为没有它我们的SSL证书无效。适用于所有浏览器,但Firefox。有什么想法吗?
http.createServer(function(req, res) {
res.writeHead(301, {
Location: "https://www." + req.headers["host"].replace("www.", "") + req.url
});
res.end();
}).listen(80);
答案 4 :(得分:0)
您可以实现从http到https
的重定向if(req.headers["x-forwarded-proto"] == "http") {
res.redirect(301, "https://" + req.host+req.url);
next();
}
答案 5 :(得分:0)
这对我来说很好。首先安装express-force-ssl。这将迫使服务器仅使用安全连接
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
var forceSsl = require('express-force-ssl');
var request = require('request');
//For https
const https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('certificates/private.key'),
cert: fs.readFileSync('certificates/certificate.crt'),
ca: fs.readFileSync('certificates/ca_bundle.crt')
};
// API file for interacting with MongoDB
const api = require('./server/routes/api');
// Parsers
app.use(forceSsl);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// Angular DIST output folder
app.use(express.static(path.join(__dirname, 'dist')));
// API location
app.use('/api', api);
app.get('*', (req, res) => {
//alert(req);
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
http.createServer(app).listen(80)
https.createServer(options, app).listen(443);