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

Apache 2.4 RequestHeader при обратном проксировании с ProxyPass

Я использую Ubuntu 14.04 и несколько серверов Apache HTTP VirtualHosts прослушивают порт 80. Один сайт выполняет обратное проксирование для прослушивания приложений на localhost. В Apache настроена базовая аутентификация для корневого расположения на этом сайте.

Вот конфиг apache:

<VirtualHost *:80>
        DocumentRoot /home/korisnik/site
        Alias /static /home/korisnik/site/static
        <Directory /home/korisnik/site/static>
          Require all granted
        </Directory>

        ProxyPass /static !
        ProxyPass / http://127.0.0.1:9002/
        ProxyPassReverse / http://127.0.0.1:9002/

        RequestHeader set X-Proxy-USER %{REMOTE_USER}e  #
        RequestHeader set X-Proxy-SECURE-USER %{REMOTE_USER}s
        RequestHeader set X-Foo "Bar"

        <Location />
          AuthType Basic
          AuthName "Authentication Required"
          AuthUserFile "/home/korisnik/htpasswd"
          Require valid-user
        </Location>
</VirtualHost>

Моя цель - передать имя пользователя аутентифицированного пользователя бэкэнд-приложению через переменную ENV, и это работало на одном сервере, на котором был включен модуль SSL в Apache, в то время как на другом сервере такая же конфигурация давала переменной ENV HTTP_X_PROXY_REMOTE_USER значение null. Единственная разница между серверами - включенный модуль SSL.

Документация (http://httpd.apache.org/docs/current/mod/mod_headers.html) Говорит, что

RequestHeader set X-VARNAME %{VARNAME}e

следует использовать на nonSSL, а на сайтах с SSL

RequestHeader set X-VARNAME %{VARNAME}s

Вот php-скрипт, который я использую для сброса заголовков:

<?php
        print "REMOTE_USER: ".$_SERVER['REMOTE_USER']."\n";
        print "HTTP_X_PROXY_USER: ".$_SERVER['HTTP_X_PROXY_USER']."\n";
        print "HTTP_X_PROXY_SECURE_USER: ".$_SERVER['HTTP_X_PROXY_SECURE_USER']."\n";
        print "HTTP_X_FOO: ".$_SERVER['HTTP_X_FOO']."\n";
?>

Я обнаружил, что пока SSL отключен, ни одна из этих директив не работает. Когда SSL включен, вторая директива работает без каких-либо других изменений, таких как включение SSL на этом сайте или включение SSL на любом другом сайте, если на то пошло.

Заголовки с включенным Apache2 mod_ssl и запрос, проходящий через ProxyPass

REMOTE_USER: 
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: korisnik
HTTP_X_FOO: Bar

Заголовки с включенным Apache2 mod_ssl и запрос, идущий прямо в файл php, без ProxyPass

REMOTE_USER: korisnik
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: korisnik
HTTP_X_FOO: Bar

Заголовки с отключенным Apache2 mod_ssl и запрос, проходящий через ProxyPass

REMOTE_USER: 
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: (null)
HTTP_X_FOO: Bar

Заголовки с отключенным Apache2 mod_ssl и запрос, идущий прямо в файл php, без ProxyPass

REMOTE_USER: korisnik
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: (null)
HTTP_X_FOO: Bar

Мне что-то не хватает, или Apache отказывается устанавливать REMOTE_USER RequestHeader для подключений за директивой Proxy, когда модуль SSL отключен?

Проблема, похоже, в том, что удаленный пользователь недоступен через "%{REMOTE_USER}e" на этапе обработки URL-адреса оценивается директива Header. Согласно документации RewriteRule:

For instance, to rewrite according to the REMOTE_USER variable from within the per-server context (httpd.conf file) you must use %{LA-U:REMOTE_USER} - this variable is set by the authorization phases, which come after the URL translation phase (during which mod_rewrite operates).

Я предполагаю, что он не работает с директивой заголовка по аналогичным причинам. Я не знаю, почему он вдруг становится доступен по SSL через "%{REMOTE_USER}s", но я снова предполагаю, что это связано с тем, что удаленный пользователь настроен на более ранней стадии, когда связь осуществляется через SSL.

Однако у меня есть решение вашей проблемы. Вы можете использовать RewriteRule, чтобы выполнить прогнозирование в соответствии с документацией, чтобы получить удаленного пользователя, а затем соответствующим образом установить заголовок.

RewriteEngine On
RewriteRule ^ - [E=MY_REMOTE_USER:%{LA-U:REMOTE_USER}]
RequestHeader set X-Proxy-USER %{MY_REMOTE_USER}e