apache2.4 上每个用户分离的反向代理

apache2.4 上每个用户分离的反向代理

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;尽管您可能希望记录本地和远程端口。我没有测试过上述任何一种方法,只是想为您想要做的事情提供一个方向。

相关内容