Nginx proxy_set_header 无法用于 Apache GEOIP

Nginx proxy_set_header 无法用于 Apache GEOIP

我使用 Nginx 反向代理到 apache2,使用如下方法教程

然后我尝试使用这个将 geoip 安装到 Nginx教程

反向代理现在已经运行顺利了一段时间,直到我尝试安装 geoip 数据库,以便在 PHP 上获取国家代码。

我按照教程的指示在 nginx 上进行了以下配置。

location ~ \.php$ {

    #       location / {
            #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            #include snippets/fastcgi-php.conf;

           proxy_pass http://1.2.3.4:8080$request_uri;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;
           proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
           proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;

           proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
           proxy_set_header GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
           proxy_set_header GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
           proxy_set_header GEOIP_REGION $geoip_region;
           proxy_set_header GEOIP_CITY $geoip_city;
           proxy_set_header GEOIP_POSTAL_CODE $geoip_postal_code;
           proxy_set_header GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
           proxy_set_header GEOIP_LATITUDE $geoip_latitude;
           proxy_set_header GEOIP_LONGITUDE $geoip_longitude;
    include /etc/nginx/proxy_params;
    }

如果我使用 proxy_pass 访问 apache2,GEOIP 变量**全部不会显示在 phpinfo 中

如果我直接使用 nginx fastcgi_pass(关闭 apache 的反向代理),我可以获取环境变量设置,并且它们反映在 phpinfo 中。

看起来 proxy_set_header 可能无法工作,因为 apache 似乎没有读取它。

我必须做什么才能让 apache 获得所有变量?

答案1

看来本教程和从该 geoip nginx 教程中复制代码的多个其他网站都是错误的/过时的。

设置代理标头时,似乎不能使用下划线(_),而只能使用(-)。因此,在从

proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;

对此

proxy_set_header GEOIP-CITY-COUNTRY-CODE $geoip_city_country_code;

apache 能够获取变量并且现在它也显示在我的 phpinfo 上。

因此,我的 php 完整位置块现在看起来像这样。

location ~ \.php$ {

           proxy_pass http://1.2.3.4:8080$request_uri;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_set_header GEOIP-COUNTRY-CODE $geoip_country_code;
           proxy_set_header GEOIP-COUNTRY-CODE3 $geoip_country_code3;
           proxy_set_header GEOIP-COUNTRY-NAME $geoip_country_name;

           proxy_set_header GEOIP-CITY-COUNTRY-CODE $geoip_city_country_code;
           proxy_set_header GEOIP-CITY-COUNTRY-CODE3 $geoip_city_country_code3;
           proxy_set_header GEOIP-CITY-COUNTRY-NAME $geoip_city_country_name;
           proxy_set_header GEOIP-REGION $geoip_region;
           proxy_set_header GEOIP-CITY $geoip_city;
           proxy_set_header GEOIP-POSTAL_CODE $geoip_postal_code;
           proxy_set_header GEOIP-CITY-CONTINENT-CODE $geoip_city_continent_code;
           proxy_set_header GEOIP-LATITUDE $geoip_latitude;
           proxy_set_header GEOIP-LONGITUDE $geoip_longitude;
    include /etc/nginx/proxy_params;
    }

使用上述设置,我将能够获取以下服务器变量及其值。请注意,出于安全原因,某些服务器添加了 HTTP 前缀。不知何故……破折号又转换回了下划线。

$_SERVER['HTTP_GEOIP_LONGITUDE'] 
$_SERVER['HTTP_GEOIP_LATITUDE'] 
$_SERVER['HTTP_GEOIP_CITY'] 
$_SERVER['HTTP_GEOIP_REGION'] 
$_SERVER['HTTP_GEOIP_CITY_COUNTRY_CODE'] 
$_SERVER['HTTP_GEOIP_COUNTRY_NAME'] 
$_SERVER['HTTP_GEOIP_COUNTRY_CODE3'] 
$_SERVER['HTTP_GEOIP_COUNTRY_CODE']

相关内容