在ExpressJS下检测HTTPS仅适用于4种方法中的1种

Dav*_*tti 2 ssl heroku node.js express

我最近在我的网站上添加了SSL证书.添加HTTPS支持后,我想将人们重定向到安全连接.我用谷歌搜索如何检测HTTPS,并在堆栈上找到许多不同的方式.它接缝他们为他人工作,但他们不适合我.在检查安全连接的4种方法中,只有一种有效.

什么对我不起作用:

  • req.secure:即使我手动放置https:// 总是返回false
  • req.connection.encrypted:即使我手动放入https://也总是返回undefined
  • req.protocol:即使我手动放置https:// 总是返回http

什么有效:

req.headers ['x-forwarded-proto']是实际返回现实的唯一方式.

知道这一点后,我通过以下方式重定向到安全连接:

// 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);
Run Code Online (Sandbox Code Playgroud)

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

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

技术规格:

  • 网站:https://simpe.li
  • 在Heroku上主持
  • 节点版本:4.1.1
  • 快递:4.13.0

kei*_*hmo 5

Heroku为您公开HTTPS,但随后将标准HTTP代理到您的工作人员.该req.headers['x-forwarded-proto']方法是在Heroku下检测HTTPS的正确方法.同样,如果需要原始IP地址和端口x-forwarded-for,x-forwarded-port则需要访问.

Heroku的路由文件,对它们的路由结构的详细信息.