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

Avi*_*ida 1 javascript heroku node.js express

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

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

我正在使用heroku托管我的项目,我注意到heroku作为默认颁发的*.herokuapp.com证书,因此我也可以使用http和https。

req.secure在app.use回调函数中查看时,如果不添加app.enable('trust proxy'),req.secure则始终为false,当我添加app.enable('trust proxy')false约2次后,https重定向后切换为true。

app.enable('trust proxy'),文档:

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

我的问题:

为什么我的服务器位于代理服务器后面?(它与颁发的*.herokuapp.com证书有关吗?),如果有人可以解释它们如何组合在一起,我的意思是,为什么我的服务器位于代理服务器后面?为什么没有app.enable明文就无法识别(或接受)安全连接?

Kei*_*ith 8

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

这样做时会添加X-Forwarded-For标头属性,以便您的代理可以看到原始URL,最后代理将转到您看到的localhost。之所以需要它,是因为X-Forwared-For可以被伪造,没有什么可以阻止客户端添加它们,而不仅仅是代理。因此,仅应在接收端启用信任代理,这将在防火墙之后。因为您有控制权,所以您可以信任它。

简而言之,如果您的网站在代理后面运行,则可以启用它。如果您的网站直接在端口80上运行,则不要信任它。由于发送者可能假装来自本地主机等。

  • 最后一行符合我的要求 (2认同)