Apache 2.4 RequestHeader,而ProxyPass反向代理

我正在使用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,但这些指令都不起作用。 启用S​​SL后,将无需进行任何其他更改(如启用该站点上的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