如何解决在Heroku上的NGINX中使用`geo`指令
从GitHub issue复制:
请参阅下面nginx.conf.erb
的相关区域。我已经在我的计算机上使用nginx和127.0.0.1
在本地测试了类似的内容,因此我相信我正确地使用了这些指令。但是,当我添加包含IP地址的CIDR组并将其放在Heroku dyno上时,仍然可以访问我的站点。
有什么想法为什么不能正确地找到它或我缺少了什么?此功能在Heroku上不起作用吗?
http {
geo $test_group {
default 0;
1.2.3.4/22 1; # this includes my local IP address
}
server {
location / {
if ($test_group) {
return 418 "short AND stout";
}
}
}
}
我的最佳猜测是,NGINX在幕后进行了大量的IP转发。例如,如果我这样做了,curl -i -H "X-Forwarded-For: 1.2.3.4" "https://my-cool-app.herokuapp.com"
仍然可以看到我的真实IP,但它不会被NGINX规则获取。
解决方法
tl; dr
它与IP转发有关,因此必须使用proxy
指令。只需添加
proxy 10.0.0.0/8;
在geo
内部,您很好。
哇!?方式和原因
Heroku在10.x.x.x
范围内的私有IP地址上转发所有内部请求。这可能是显而易见的,并且对熟悉网络和/或NGINX的人们来说立即有意义。我可以通过返回$remote_addr
作为标头来发现它,并注意到它不是我的公共IP地址。尽管the docs对于新手来说有很多不足之处,但proxy
的描述使我感到困惑,因为如果我将CIDR范围代理给专用IP(10.0.0.0/8
),则X-Forwarded-For
地址代替。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。