Назад | Перейти на главную страницу

Как передать заголовки HTTP-запроса GeoIP на серверную часть с Apache?

Я использую nginx для прокси-запросов HTTP к приложению PHP, работающему в рамках Apache 2.4 (mod_php5) в контейнере Docker (cbeer / piwik).

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

Приложение PHP - Piwik 2.16.

Я вставляю HTTP-заголовки GeoIP с помощью nginx:

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 (по крайней мере, так думает) не может видеть заголовки HTTP, введенные через nginx. На странице настроек Piwik для геолокации отображается предупреждение о том, что Piwik не может найти переменные GeoIP в PHP. $_SERVER. Заголовки GeoIP поступают как, например, HTTP_GEOIP_ADDR но должно быть GEOIP_ADDR. Я также не могу редактировать приложение, чтобы использовать эти «новые» имена заголовков.

@RichardSmith упомянул, что мне нужно сопоставить HTTP_GEOIP_ переменные для GEOIP_ в Apache с помощью setenv. Я пробовал несколько комбинаций, но мне не удалось использовать переменные (заголовки запросов) в качестве значений для переменной среды.

SetEnv GEOIP_ADDR "%{HTTP_GEOIP_ADDR}e"

В результате получается фактическая строка "%{HTTP_GEOIP_CITY}e"хранится в переменной вместо значения HTTP_GEOIP_CITY.

Как составить карту HTTP_GEOIP_ переменные для GEOIP_ в Apache с помощью setenv?

Ваше предположение об 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

Итак, если вы поменяете местами свою декларацию, это может сработать.