在 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将改用地址。