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

标签 node.js ssl express heroku

我最近在我的网站上添加了 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 之后,上述方法也会返回 falsehttp

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

技术规范:

  • 网站: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-forx-forwarded-port

Heroku Routing文档中有关于其路由结构的更多详细信息。

关于node.js - 在 ExpressJS 下检测 HTTPS 仅适用于 4 种方法中的 1 种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34071093/

相关文章:

javascript - 下载文本文件,并在nodejs中另存为字符串

security - 已设置 SSL 时是否需要 HttpOnly?

node.js - 如何设置 Express 4.0 应用程序

node.js - Node.js Express库的简单代码不起作用

node.js - Tensorflow NodeJS - 序列化/反序列化模型而不将其写入 URI

node.js - verdaccio 无法启动,出现错误 "Cannot find module"

node.js - Node : How to test middleware making external call

java - Java 中的 SSL 证书验证

java - createSocket() 长时间后返回

javascript - "var app = require('中的第二个括号表示')()"是做什么的?