我最近在我的网站上添加了 SSL 证书。添加 HTTPS 支持后,我想将人们重定向到安全连接。我用谷歌搜索查看如何检测 HTTPS,并在 Stack 上找到了许多不同的方法。它接缝他们为别人工作,但他们不为我工作。在检查安全连接的 4 种方法中,只有一种有效。
什么对我不起作用:
- req.secure:总是返回false,即使我手动输入 https://
- req.connection.encrypted:总是返回undefined,即使我手动输入 https://
- req.protocol:总是返回http,即使我手动输入https://
什么有效:
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);
在我上面提到的任何其他方式中,我都会得到一个重定向循环,因为即使在重定向到 HTTPS 之后,上述方法也会返回 false 或 http。
我的问题是:为什么其他方法不起作用?
技术规范:
- 网站:https://simpe.li
- 托管在 Heroku 上
- Node 版本:4.1.1
- express :4.13.0
最佳答案
Heroku 为您公开 HTTPS,然后将标准 HTTP 代理给您的工作人员。 req.headers['x-forwarded-proto']
方法是在 Heroku 下检测 HTTPS 的正确方法。同样,如果您需要原始 IP 地址和端口,则需要访问 x-forwarded-for
和 x-forwarded-port
。
Heroku Routing文档中有关于其路由结构的更多详细信息。
关于node.js - 在 ExpressJS 下检测 HTTPS 仅适用于 4 种方法中的 1 种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34071093/