我有一个启用了 mod_proxy 的 Apache Web 服务器和一个虚拟主机 proxy.domain.com。此代理配置为使用 AuthType Basic 提示用户输入凭据。然后,通过 ProxyPass 和 ProxyReverse 代理即可访问 web.domain.com 的内容。但是,REMOTE_USER 变量为空。我尝试了各种方法来实现这一点,包括使用 mod_rewrite 和 mod_headers,但所有尝试都失败了。有没有人比我幸运?
谢谢。
答案1
通过 mod_headers、mod_rewrite 和 mod_proxy 可以实现这一点。
在代理上,我假设您的身份验证已正常工作并正确设置了 REMOTE_USER。如果是这样,则将 REMOTE_USER 的值放入后端的 Proxy-User 标头中,如下所示:
RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}] # note mod_rewrite's lookahead option
RequestHeader set Proxy-User %{PROXY_USER}e
事情的经过如下:
- RewriteRule 会针对每个请求触发,并将环境变量 PROXY_USER 设置为等于 REMOTE_USER 的值,该值应该已经由 auth 模块设置。
- RequestHeader 设置了一个名为 Proxy-User 的请求标头,其值为 PROXY_USER
现在在后端,您可以提取该标题值并像这样设置 REMOTE_USER:
RewriteCond %{HTTP:Proxy-user} ^(.*)$
RewriteRule .* - [E=REMOTE_USER:%1]
事情的经过如下:
- RewriteCondition 检查 Proxy-User 标头的值,看它是否与模式 ^.*$ 匹配(它会匹配)。括号告诉 mod_rewrite 将该值存储在 %1 中。
- 然后,RewriteRule 使用 %1 中的值设置环境变量 REMOTE_USER。
答案2
在 apache 2.4 上,尝试获取由修改 LDAP 服务器和mod_kerb,这就是有效的。
假设你正在寻找AUTHORIZE_sAMAccountName
,
RewriteEngine On
RewriteRule .* - [E=THE_ACCOUNT_NAME:%{ENV:AUTHORIZE_sAMAccountName}]
RequestHeader set MY_ACCOUNT_NAME %{THE_ACCOUNT_NAME}e
此后,可以记录 HEADER例如:
CustomLog /tmp/custom.log "%h %l %u %t \"%r\" %>s %b %{MY_ACCOUNT_NAME}i"
参考:
答案3
在后端,如果您不想使用 mod_rewrite,也可以使用标准 mod_auth_basic。假设您将用户作为 X-Remote-User 传入:
<Location />
AuthBasicFake "%{HTTP:X-Remote-User}" "password"
</Location>
这只在 2.4 中有效,但具有设置 true mod_auth 的其他方面(即 PHP 的身份验证支持)的额外好处
答案4
填充标题的示例X-远程用户内容为远程用户变量,并将该标头发送到后端代理(apache 2.4.6)。
# Example for Apache 2.4.6
<VirtualHost *:80>
RewriteEngine on
<Location />
###############################################
# Your authentication logic here
AuthType .......
AuthName .......
AuthBasicProvider .......
.... etc
Require valid-user
###############################################
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X-Remote-User %{RU}e
</Location>
ProxyTimeout 300
ProxyPass / http://localhost:81/
ProxyPassReverse / http://localhost:81/
</VirtualHost>