我有一个在 Tomcat 服务器上运行的 Web 应用程序,该服务器位于 Apache httpd 服务器的“后面”,我正在使用 mod_proxy 将请求从 httpd 转发到 tomcat 服务器。httpd 服务器使用 mod_auth_tkt 进行身份验证,它将有关用户的信息存储在环境变量 REMOTE_USER 中。我使用 mod_rewrite 将此变量从 httpd 传递到 tomcat 服务器,并将其保存为标头 (X-Forwarded-User)。
ProxyPass 设置为
httpd_server/app/ -> tomcat_server/app/
这是vhost.conf:
<Location />
RewriteEngine On
RequestHeader unset X-Forwarded-User
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RU:%1,NS]
RequestHeader add X-Forwarded-User %{RU}e
</Location>
<IfModule mod_proxy.c>
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app/ http://127.0.0.1:8084/app/
ProxyPassReverse /app/ http://127.0.0.1:8084/app/
</IfModule>
这很完美。但如果尝试将 ProxyPass 更改为
httpd_server/ -> tomcat_server/app/
因此将 vhost.conf 更改为:
ProxyPass / http://127.0.0.1:8084/app/
ProxyPassReverse / http://127.0.0.1:8084/app/
然后,标头(X-Forwarded-User)在 Web 应用程序上最终为空(null)。
经过进一步调查,我发现如果我尝试转发不同的变量,例如 REMOTE_PORT(甚至是字符串),则两种配置下的一切都可以正常工作(应用程序正确接收标头)。
从根目录代理时,REMOTE_USER 转发不起作用,这有什么明显的错误吗?我是不是漏掉了什么,还是这是 mod_auth_tkt 的问题?