Я использую 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