我需要将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.use
,app.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
表达不会识别(或接受)安全连接?
答案 0 :(得分:5)
如果您没有在代理服务器后面运行,则不需要。例如,如果您在服务器上运行多个网站,则可能是您使用代理服务器。
X-Forwarded-For标头属性在执行此操作时添加,以便您的代理可以查看原始URL是什么,代理最终将转到您看到的localhost。它需要的原因是X-Forwared-For可以伪造,没有什么能阻止客户端添加这些,而不仅仅是代理。因此,只应在接收端启用trust-proxy,这将位于防火墙之后。因为你有控制权,所以你可以相信这一点。
简而言之,如果您的网站在代理服务器后面运行,您可以启用它。如果您的网站直接在端口80上运行,您不希望信任它。由于发件人可能假装来自localhost等。