Javascript NodeJS,Express,我为什么要使用app.enable(';信任代理';);

Javascript NodeJS,Express,我为什么要使用app.enable(';信任代理';);,javascript,node.js,express,heroku,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默认发布了*.he

我需要将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
cert,因此我也可以使用http和https

当查看
app.中的
req.secure
时,使用
回调,而不使用
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
express无法识别(或接受)安全连接?

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

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


简而言之,如果你的网站运行在代理之后,你可以启用它。如果您的网站直接在端口80上运行,您不想信任它。因为发送方可能会假装来自本地主机等。

如果您没有在代理后运行,则不需要这样做。例如,如果您在一台服务器上运行多个网站,那么您很可能使用代理。执行此操作时,会添加X-Forwarded-For头属性,以便您的代理可以看到原始url是什么,代理最终将转到您看到的本地主机。之所以需要它,是因为X-Forwared-For可以伪造,没有什么可以阻止客户端添加这些,不仅仅是一个代理。因此,信任代理应该只在接收端启用,接收端位于防火墙后面。因为你有控制权,所以你不能信任。@Keith只需将其作为一个答案发布,如果必要,提供反向链接:)@Keith你真的应该发布一个答案,这样我就可以接受它,顺便说一句,
req.secure
的原因是
false
没有
app.enable('trust proxy')
是内部的(在防火墙后面)代理和我的服务器之间的通信不安全?@avielfedda确定,完成。我现在在我的反向代理上执行所有SSL,并强制使用SSL,因为谷歌也会对SSL进行更好的排名。所以我从来没有真正需要检查req.secure,因为我基本上在端口http:80->https:443上有一个完整的重定向。我在反向代理上这样做的另一个原因也是为了性能,它允许反向代理处理加密,而我的express服务器不需要太多。最后一行符合我的要求