如何使用 Apache 将 GeoIP HTTP 请求标头传递到后端?

如何使用 Apache 将 GeoIP HTTP 请求标头传递到后端?

我正在使用 nginx 将 HTTP 请求代理到 Docker 容器内 Apache 2.4(mod_php5)范围内运行的 PHP 应用程序(cbeer/piwik)。

                     +------------------------------+
                     |        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_变量映射到GEOIP_Apache 中。我尝试了几种组合,但无法将变量(请求标头)用作环境变量的值。

SetEnv GEOIP_ADDR "%{HTTP_GEOIP_ADDR}e"

这会导致变量中存储实际的字符串“ %{HTTP_GEOIP_CITY}e”,而不是 的值HTTP_GEOIP_CITY

如何使用 setenv将HTTP_GEOIP_变量映射到Apache 内部?GEOIP_

答案1

您对 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

因此,如果你交换你的声明,可能会有效。

相关内容