Expressjs重定向到https(使用Cloudflare Flexible SSL)

时间:2014-11-16 18:44:20

标签: node.js express https

我正在使用Expressjs(NodeJS框架),我想将所有流量重定向到https,我不使用SSL证书,而是使用Cloudflare灵活的ssl。

我正在使用这个中间件:

//FORCE SSL
app.use(function(req, res, next) {
  if(!req.secure) {
    return res.redirect(['https://', req.get('Host'), req.url].join(''));
  }
  next();
});

我以这种方式启动应用程序:

//Firing Up express
//====================================================================
app.set('port', process.env.PORT || 80);
var server = app.listen(app.get('port'), function() {
   console.log('[-]');
   console.log(('[+] Express server listening on port '+ server.address().port).green);
   console.log('[-]');
});

应用程序重定向到https://但无法加载

谷歌Chrome控制台说:

Failed to load resource: net::ERR_CONNECTION_REFUSED https://beta.domain.io/
Failed to load resource: net::ERR_CONNECTION_CLOSED https://beta.domain.io/
Failed to load resource: net::ERR_CACHE_MISS 

有人能指出我正确的方向吗?

提前致谢。

1 个答案:

答案 0 :(得分:6)

CloudFlare的服务器实际上是通过不安全的http与您的服务器通信。然后,它通过https将响应转发给客户端。由于与服务器的所有连接都是http,因此您的应用会重定向所有内容。在这种情况下,永远不会有有效的响应,因此无法加载。

当代理服务器连接到您的Web服务器时,它们会通过http标头传递有关客户端连接的其他信息。你应该寻找两个标题。 X-Forwarded-For和X-Forwarded-Proto。 X-Forwarded-For会告诉你原始客户端的IP地址是什么,X-Forwarded-Proto告诉你原始客户端正在使用什么协议。

在您的情况下,您希望查看X-Forwarded-Proto标头,如果它是http,则重定向到等效的https资源。

//FORCE SSL
app.use(function(req, res, next) {
  if(req.headers['x-forwarded-proto']==='http') {
    return res.redirect('https://' + req.headers.host + req.url);
  }
  next();
});