将http重定向到https express.js

时间:2014-03-11 17:41:45

标签: node.js web-services express https

我正在尝试在我的快递应用中将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,它会重定向。

6 个答案:

答案 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);