在apache2.4上为每个用户分开反向代理

从mod_proxy指南我configuration反向代理与用户身份validation。

# 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> 

这工作如下:用户访问服务器 – >服务器询问用户名/密码 – >用户input他的凭据 – >如果用户常春藤证书正常,然后反向代理工程的本地主机端口10080。

所有用户都添加了htpasswd。 我在Linux上运行apache2.4。

我需要做的是:我希望允许不同的用户使用代理。 在服务器上反向隧道的数量是开放的端口10080,10081,10082,等等…我想分配每个单独的用户使用分开的代理端口。 即:

  • 常春藤 – > 10080
  • 乔 – > 10081
  • doe – > 10082

如果我写Require user ivy joe doe那么我将所有用户redirect到单个端口10080。

看来这个技巧是在ProxyPass "/" "http://localhost:10080/"<Proxy *> ProxyPass "/" "http://localhost:10080/"某处。 或者在哪里?

更新:继Jenny的build议尝试:

 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 

这工作,但这不是有条件的:即我仍然不能分配不同的redirect每个用户。

更新2:塞德里克骑士的解决scheme也没有运气。 决定放弃与Apache,切换到Nginx。 工程确定。 每个用户分开的反向代理的服务器configuration是:

 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; } } } 

这是蛮力的解决scheme。 在下一步中,我将添加从文件读取地图用户:端口。

是的,珍妮的想法是有道理的。 不要使用ProxyPass指令,只需使用mod_rewxy通过使用P标志的mod_rewrite,然后你可以在下一个阶段用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指令相应地区分authentication挑战:

 <Location "/"> AuthType Basic AuthName "Password Required" AuthUserFile /home/secure/.passwords <RequireAll> Require valid-user </RequireAll> </Location> 

我没有看到在反向代理情况下需要ProxyVia ; 尽pipe您可能要logging本地和远程端口。 我还没有testing过任何一个,只是想为你想做的事提供一个方向。