AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 754481
Accepted
morleyc
morleyc
Asked: 2016-02-07 11:34:06 +0800 CST2016-02-07 11:34:06 +0800 CST 2016-02-07 11:34:06 +0800 CST

cloudflare 代理后面的 nginx GEOIP 显示错误的国家(不是最终用户,但如果是代理)

  • 772

我正在使用 Cloudflare 和 nginx geoip 指令:

geoip_country /usr/local/share/GeoIP/GeoIP.dat;
geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat;

他们选择 IP 正常(pipaddress因为请求在标头中标记为已转发),但将国家/地区显示为 SG(cloudflare 代理位置)。

如果HTTP_X_FORWARDED_FOR设置了标题,是否有最终用户的国家?

<?php
    if (getenv(HTTP_X_FORWARDED_FOR))
    {
        $pipaddress = getenv(HTTP_X_FORWARDED_FOR);
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your IP address is : ".$pipaddress. " (via proxy $ipaddress) " ;
    }
    else
    {
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your IP address is : $ipaddress";
    }

    $country = getenv(GEOIP_COUNTRY_NAME);
    $country_code = getenv(GEOIP_COUNTRY_CODE);
    echo "<br/>Your country : $country ( $country_code ) ";
?>

并且/etc/nginx/fastcgi_params如下:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $request_filename;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# Set php-fpm geoip variables
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
fastcgi_param GEOIP_LATITUDE $geoip_latitude;
fastcgi_param GEOIP_LONGITUDE $geoip_longitude;
nginx
  • 3 3 个回答
  • 4231 Views

3 个回答

  • Voted
  1. Best Answer
    Sunit Kumar Nandi
    2016-04-03T11:11:35+08:002016-04-03T11:11:35+08:00

    您的 nginx 服务器无法确定传递给 PHP 的请求的真实 IP。解决方法是使用 Nginx 的 Real IP 模块。

    看看这个https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-

    只需将链接中的代码片段添加到您的配置文件并重新启动 nginx。

    • 4
  2. user47713
    2019-07-26T03:17:46+08:002019-07-26T03:17:46+08:00

    @the_nuts 的答案扩展。我拼凑了一个小脚本,它会geoip_proxy根据 cloudflare 页面上的列表自动生成指令列表:

    #!/bin/sh
    # /etc/nginx/geoip_update.sh
    # Update GeoIP proxy list to the current list of cloudflare IP addresses
    
    outfile=$(dirname "$0")/geoip_cloudflare.conf
    
    echo "# Auto-generated by $0" > "$outfile"
    (
        curl https://www.cloudflare.com/ips-v4
        curl https://www.cloudflare.com/ips-v6
    ) | while read ip; do
        echo "geoip_proxy $ip;"
    done > "$outfile"
    echo List updated.
    

    用法:启动此脚本一次,它将生成/etc/nginx/geoip_cloudflare.conf文件。然后将以下内容添加到您的http块中:

    include /etc/nginx/geoip_cloudflare.conf;
    

    或者,将脚本添加到 cron 以定期更新 IP 列表。不知道他们多久改变一次。

    注意:脚本不是很优化,在更新过程中配置/包含文件会在短时间内为空。如果 nginx 恰好在那个时间重新启动,那么 geoip_proxy 指令将不起作用。

    • 2
  3. the_nuts
    2018-12-22T18:03:05+08:002018-12-22T18:03:05+08:00

    正确的方法是使用geoip_proxy指令将 CloudFlare IP 范围设置为受信任的代理。不需要额外的模块。

    到今天为止,结果如下:

    geoip_proxy 103.21.244.0/22;
    geoip_proxy 103.22.200.0/22;
    geoip_proxy 103.31.4.0/22;
    geoip_proxy 104.16.0.0/12;
    geoip_proxy 108.162.192.0/18;
    geoip_proxy 131.0.72.0/22;
    geoip_proxy 141.101.64.0/18;
    geoip_proxy 162.158.0.0/15;
    geoip_proxy 172.64.0.0/13;
    geoip_proxy 173.245.48.0/20;
    geoip_proxy 188.114.96.0/20;
    geoip_proxy 190.93.240.0/20;
    geoip_proxy 197.234.240.0/22;
    geoip_proxy 198.41.128.0/17;
    geoip_proxy 2400:cb00::/32;
    geoip_proxy 2405:b500::/32;
    geoip_proxy 2606:4700::/32;
    geoip_proxy 2803:f800::/32;
    geoip_proxy 2c0f:f248::/32;
    geoip_proxy 2a06:98c0::/29;
    

    您可以在此处找到 CloudFlare IP 的更新列表:https ://www.cloudflare.com/ips/

    • 1

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve