我正在使用Ubuntu 14.04,并且有多个Apache HTTP VirtualHosts在端口80上侦听。一个站点是在本地主机上侦听的应用程序的反向代理。 Apache具有为该站点上的根位置configuration的基本身份validation。
这里是Apacheconfiguration:
<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>
我的目标是通过ENVvariables将已通过身份validation的用户的用户名传递给后端应用程序,并且这在一个在Apache中启用了SSL模块的服务器上工作,而在另一个服务器上的相同configuration下,HTTP_X_PROXY_REMOTE_USER ENVvariables设置为null。 仅在服务器之间启用SSL模块。
文档( http://httpd.apache.org/docs/current/mod/mod_headers.html )说
RequestHeader set X-VARNAME %{VARNAME}e
应在非SSL上使用,而在运行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的头文件被禁用,并且不需要ProxyPass就直接请求到php文件
REMOTE_USER: korisnik HTTP_X_PROXY_USER: (null) HTTP_X_PROXY_SECURE_USER: (null) HTTP_X_FOO: Bar
我是否遗漏了一些东西,或者Apache在禁用SSL模块的时候拒绝为Proxy指令后面的连接设置REMOTE_USER RequestHeader?
问题似乎是,在处理Header指令的URL处理阶段,远程用户不能通过"%{REMOTE_USER}e"获得。 根据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).
我相信,由于类似的原因,它会因为header指令而失败。 我不知道为什么通过"%{REMOTE_USER}s"在SSL下突然变得可用,但是我再次推测这是因为远程用户是在通信过SSL的早期阶段被设置的。
但是,我确实有解决您的问题。 您可以使用RewriteRule按照文档进行查看以获取远程用户,然后相应地设置标题。
RewriteEngine On
RewriteRule ^ - [E = MY_REMOTE_USER:%{LA-U:REMOTE_USER}]
RequestHeader设置X-Proxy-USER%{MY_REMOTE_USER} e