在 Nginx 中使用 GeoIP2 获取用户国家

问题描述

我一直在努力让这个东西正常工作,但似乎无论我做什么,X-Country 都会得到值“US”,因为这是最后一个 IP 地址的国家/地区X-Forwarded-To 标头。这是 Google 的负载平衡器之一。

我似乎也找不到很多在线正确配置的示例,我发现的大部分源代码都是针对 GeoIP v1 的。

文件 /usr/share/GeoIP/GeoLite2-Country.mmdb 存在并且已经过验证,可以为我正在测试的 IP 地址返回正确的国家/地区。 Sentry Python SDK 还根据标头中的第一个 IP 将 IP 地址解析为瑞典。

http {
    ...
    geoip2_proxy 130.211.0.0/22;
    geoip2_proxy 35.191.0.0/16;
    geoip2_proxy_recursive off;
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
        $geoip2_data_country_code default=SE country iso_code;
        auto_reload 5m;
    }
    ...
}

server {
    ...
    location / {
        ...
        proxy_set_header X-Country $geoip2_data_country_code;
        ...
    }
}

有什么想法吗?

如果我删除所有 GeoIP2 配置,这是 Nginx 变量的状态:

GET /foobar HTTP/1.1
remote_addr:              130.211.0.x
http_x_forwarded_for:     <my.real.ip>,130.211.38.x
realip_remote_addr:       130.211.0.x
http_x_real_ip:           -
proxy_add_x_forwarded_for: <my.real.ip>,130.211.38.x,130.211.0.x

似乎没有 set_real_ip_from 等的组合只会分配任何变量 <my.real.ip> 以便我可以使用它。

编辑:以下似乎有效,但我认为它容易被欺骗:

    geoip2_proxy 0.0.0.0/0;
    geoip2_proxy_recursive on;
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
        $geoip2_data_country_code default=SE country iso_code;
    }

所以我的 geoip2_proxy 声明似乎有问题,但我不确定如何?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)