从mod_proxy 指南我配置了具有用户身份验证的反向代理。
# Set reverse proxy
ProxyPass "/" "http://localhost:10080/"
ProxyPassReverse "/" "http://localhost:10080/"
ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
AuthType Basic
AuthName "Password Required"
AuthUserFile /home/secure/.passwords
Require user ivy
</Proxy>
其工作原理如下:用户访问服务器 --> 服务器询问用户名/密码 --> 用户输入其凭据 --> 如果用户 ivy 的凭据正确,则反向代理将在本地主机上的端口 10080 上运行。
所有用户都使用 htpasswd 添加。我在 Linux 上运行 apache2.4。
我需要做什么:我想允许不同的用户使用代理。服务器上打开了多个反向隧道,端口为 10080、10081、10082 等……我想为每个用户分配单独的代理端口。即:
- 常春藤 --> 10080
- 乔 --> 10081
- 母鹿 --> 10082
如果我写的Require user ivy joe doe
话,我会将所有用户重定向到单个端口 10080。
看来诀窍就在于线条ProxyPass "/" "http://localhost:10080/"
和的某个地方<Proxy *>
。或者在哪里?
更新: 按照珍妮的建议尝试:
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteCond %{REMOTE_USER} ivy # Unconditional redirect for testing.
RewriteRule ^/(.*)$ "http://localhost:10080/test.html" [R=301,L]
</IfModule>
尝试启用代理(代理比重写更强)并禁用代理(显示本地 index.html)。
尝试使用标志[R,L]
,,[L,R]
-[L,R=301]
没有运气。
尝试添加到<Directory "/var/www/html">
和到<Proxy *>
:
RewriteEngine On
RewriteRule ^/(.*)$ "http://localhost:10080/test.html" [R=301,L]
尝试启用代理(代理比重写更强)并禁用代理(显示本地 index.html)。
深挖后发现了这个技巧:
RedirectMatch ^/.*$ /test.html
这可行,但这不是有条件的:即我仍然无法为每个用户分配不同的重定向。
更新2: 尝试了 Cedric Knight 的解决方案,但同样失败。决定放弃 Apache,转而使用 nginx。工作正常。每个用户分离反向代理的服务器配置为:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
set $auth_status 100;
server_name localhost;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ =404;
auth_basic "Restricted content";
auth_basic_user_file "/home/secure/.passwords";
auth_request_set $auth_status $upstream_status;
if ($remote_user = "ivy") {
proxy_pass http://localhost:10080;
break; # break is essential since proxy_pass in 'if' isn't allowed.
}
if ($remote_user = "joe") {
proxy_pass http://localhost:10081;
break;
}
}
}
这是强力解决方案。下一步,我将添加从文件读取映射 user:port。
答案1
是的,Jenny 的想法很有道理。不要使用 ProxyPass 指令,只需使用使用 P 标志通过 mod_rewrite 进行 mod_proxy然后你可以作为下一阶段设置新增用户和RewriteMap
。
<IfModule mod_proxy.c>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REMOTE_USER} ivy
RewriteRule ^/(.*)$ "http://localhost:10080/$1" [P]
RewriteCond %{REMOTE_USER} joe
RewriteRule ^/(.*)$ "http://localhost:10081/$1" [P]
#etc.
# optional step: set up RewriteMap
RewriteMap user-to-port txt:/home/proxy-ports.txt
# contains one entry per line 'doe 10082' etc
RewriteCond %{REMOTE_USER} ^(.*)$
RewriteRule ^/(.*)$ "http://localhost:${user-to-port:%1|10080}/$1" [P]
# 10080 is default port for other users
</IfModule>
</IfModule>
如果您删除了该<Proxy>
部分,请使用 Apache 2.4 指令相应地分离出身份验证挑战:
<Location "/">
AuthType Basic
AuthName "Password Required"
AuthUserFile /home/secure/.passwords
<RequireAll>
Require valid-user
</RequireAll>
</Location>
我认为在反向代理情况下不需要这样做ProxyVia
;尽管您可能希望记录本地和远程端口。我没有测试过上述任何一种方法,只是想为您想要做的事情提供一个方向。