在ExpressJS下检测HTTPS只能使用四种方法中的一种

我最近添加了一个SSL证书到我的网站。 在添加HTTPS支持后,我想将人员redirect到安全连接。 我用googlesearch了解如何检测HTTPS并在Stack上find许多不同的方法。 它接缝他们为别人工作,但他们不为我工作。 4种方式检查一个安全的连接,只有一个工作。

什么不适合我:

  • req.secure :即使我手动把https://总是返回false
  • req.connection.encrypted :总是返回undefined,即使我手动把https://
  • req.protocol :总是返回http,即使我手动把https://

什么工作:

req.headers ['x-forwarded-proto']是实际返回实际的唯一途径。

知道这个我redirect到一个安全的连接,以下列方式:

// Check if the connection is secure, if not, reddiret to a secure one. function requireHTTPS(req, res, next) { if(process.env.NODE_ENV == 'production') { if (req.headers['x-forwarded-proto'] !== 'https') { return res.redirect('https://' + req.get('host') + req.url); } } next(); } app.use(requireHTTPS); 

以上面提到的任何其他方式,我将得到一个redirect循环,因为即使在redirect到HTTPS之后,上述方法也会返回falsehttp

我的问题是:为什么其他方法不起作用?

技术规格:

  • 网站: https : //simpe.li
  • 托pipe在Heroku上
  • 节点版本:4.1.1
  • Express:4.13.0

Heroku为您揭示了HTTPS,但是接着将标准HTTP代理给您的工作者。 req.headers['x-forwarded-proto']方法是在Heroku下检测HTTPS的正确方法。 同样,如果需要源IP地址和端口,则需要访问x-forwarded-forx-forwarded-port port。

Heroku路由文档有他们的路由结构的更多细节。