如何使用 Apache 將 GeoIP HTTP 請求標頭傳遞到後端?
我正在使用 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 中?
您對 Apache
SetEnv
指令語法的假設是錯誤的。從文件來看,似乎是相反的:
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
所以,如果你交換你的聲明,可能會奏效。