NodeJS,Express,我为什么要使用app.enable('trust proxy');

时间:2016-10-08 07:55:03

标签: javascript node.js express heroku

我需要将http重定向到https并找到此代码:

app.enable('trust proxy');
app.use((req, res, next) => {
    if (req.secure) {
        next();
    } else {
        res.redirect('https://' + req.headers.host + req.url);
    }
});

我正在使用heroku来托管我的项目,我注意到heroku默认发布了*.herokuapp.com证书,所以我也可以使用http和https。

req.secure回调中查看app.useapp.enable('trust proxy')时,req.secure始终为false,当我添加app.enable('trust proxy')时,它为false约2次,https重定向后,它会切换到true

app.enable('trust proxy')the docs:

  

表示应用程序位于前置代理后面,并使用   X-Forwarded- *标头用于确定连接和IP地址   客户。

我的问题:

为什么我的服务器会在代理服务器后面?(它与发布的*.herokuapp.com证书有关吗?),如果有人可以解释所有人是如何组合起来的,我的意思是,为什么我的服务器在代理服务器后面?为什么没有app.enable表达不会识别(或接受)安全连接?

1 个答案:

答案 0 :(得分:5)

如果您没有在代理服务器后面运行,则不需要。例如,如果您在服务器上运行多个网站,则可能是您使用代理服务器。

X-Forwarded-For标头属性在执行此操作时添加,以便您的代理可以查看原始URL是什么,代理最终将转到您看到的localhost。它需要的原因是X-Forwared-For可以伪造,没有什么能阻止客户端添加这些,而不仅仅是代理。因此,只应在接收端启用trust-proxy,这将位于防火墙之后。因为你有控制权,所以你可以相信这一点。

简而言之,如果您的网站在代理服务器后面运行,您可以启用它。如果您的网站直接在端口80上运行,您不希望信任它。由于发件人可能假装来自localhost等。