Nginx

如何使用 Apache 將 GeoIP HTTP 請求標頭傳遞到後端?

  • March 13, 2020

我正在使用 nginx 將 HTTP 請求代理到在 Docker 容器 ( cbeer/piwik ) 內執行在 Apache 2.4 (mod_php5) 範圍內的 PHP 應用程序。

                    +------------------------------+
                    |        Docker Container      |
+-------+            |  +--------+          +-----+ |
| nginx |----------->|->| apache |--------->| php | |
+-------+ proxy_pass |  +--------+ mod_php5 +-----+ |
                    +------------------------------+

PHP 應用程序是 Piwik 2.16。

我用 nginx 注入 GeoIP HTTP 標頭:

proxy_set_header GeoIP-Addr             "$remote_addr";
proxy_set_header GeoIP-Country-Code     "$geoip_country_code";
proxy_set_header GeoIP-Country-Name     "$geoip_country_name";
proxy_set_header GeoIP-Continent-Code   "$geoip_city_continent_code";
proxy_set_header GeoIP-Region-Name      "$geoip_region_name";
proxy_set_header GeoIP-Region           "$geoip_region";
proxy_set_header GeoIP-City             "$geoip_city";
proxy_set_header GeoIP-Metro-Code       "$geoip_dma_code";
proxy_set_header GeoIP-Area-Code        "$geoip_area_code";
proxy_set_header GeoIP-Latitude         "$geoip_latitude";
proxy_set_header GeoIP-Longitude        "$geoip_longitude";
proxy_set_header GeoIP-Postal-Code      "$geoip_postal_code";
proxy_set_header GeoIP-Isp              "$geoip_org";
proxy_set_header GeoIP-Organization     "$geoip_org";
proxy_set_header GeoIP-Netspeed         "";

不幸的是,Piwik(至少認為它)看不到通過 nginx 注入的請求 HTTP 標頭。在用於地理定位的 Piwik 設置頁面上是關於 Piwik 無法在 PHP 中找到 GeoIP 變數的警告$_SERVER。GeoIP 標頭以 eg 形式到達,HTTP_GEOIP_ADDR但必須是GEOIP_ADDR. 我也無法編輯應用程序以使用這些“新”標題名稱。

@RichardSmith 提到我必須使用 setenv將HTTP_GEOIP_變數映射到Apache 中。GEOIP_我嘗試了幾種組合,但沒有設法使用變數(請求標頭)作為環境變數的值。

SetEnv GEOIP_ADDR "%{HTTP_GEOIP_ADDR}e"

這導致%{HTTP_GEOIP_CITY}e儲存在變數中的實際字元串“”而不是 的值HTTP_GEOIP_CITY

如何使用 setenv 將HTTP_GEOIP_變數映射到GEOIP_Apache 中?

您對 ApacheSetEnv指令語法的假設是錯誤的。

從文件來看,似乎是相反的:

SetEnv HTTP_GEOIP_ADDR %{GeoIP-Addr}e

這是文件的連結:

https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv

它指出Sets an internal environment variable, which is then available to Apache HTTP Server modules, and passed on to CGI scripts and SSI pages.

Example

SetEnv SPECIAL_PATH /foo/bin

所以,如果你交換你的聲明,可能會奏效。

引用自:https://serverfault.com/questions/761261