我正在使用 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.
所以,如果你交换你的声明,可能会奏效。