在 Heroku 上的 NGINX 中使用 `geo` 指令
Use `geo` directive in NGINX on Heroku
从 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;博士
它与IP转发有关,所以必须使用proxy
指令。只需添加
proxy 10.0.0.0/8;
在 geo
里面,你可以开始了。
哇哦!?如何以及为什么
Heroku 转发对 10.x.x.x
范围内私有 IP 地址的所有内部请求。对于更熟悉网络 and/or NGINX 的人来说,这可能是显而易见的并且立即有意义。我能够通过将 $remote_addr
作为 header 返回来弄清楚,并注意到它是 而不是 我的 public IP 地址。虽然 the docs 为新手留下了很多不足之处,但 proxy
的描述让我明白,如果我代理了私有 IP (10.0.0.0/8
) 的 CIDR 范围,X-Forwarded-For
将改用地址。
从 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;博士
它与IP转发有关,所以必须使用proxy
指令。只需添加
proxy 10.0.0.0/8;
在 geo
里面,你可以开始了。
哇哦!?如何以及为什么
Heroku 转发对 10.x.x.x
范围内私有 IP 地址的所有内部请求。对于更熟悉网络 and/or NGINX 的人来说,这可能是显而易见的并且立即有意义。我能够通过将 $remote_addr
作为 header 返回来弄清楚,并注意到它是 而不是 我的 public IP 地址。虽然 the docs 为新手留下了很多不足之处,但 proxy
的描述让我明白,如果我代理了私有 IP (10.0.0.0/8
) 的 CIDR 范围,X-Forwarded-For
将改用地址。