对所有传入 URL 使用 Mod_rewrite 和身份验证

对所有传入 URL 使用 Mod_rewrite 和身份验证

我需要确保我的 URL(称为 www.domain.com)至少通过基本 HTTP 身份验证始终受到保护。此外,我想使用 mod_rewrite 将我的用户发送到我的服务器上运行的两个 OC4j 实例之一。我还想使用相同的身份验证保护我的 OC4j 管理面板(和其他管理类型的功能)。我将有 2 个用户,分别称为管理员(管理员可以访问 OC4j 实例和 OC4j 管理面板)和访客(访客只能访问 OC4j 实例)。

因此,假设我有两个 OC4j 实例 - instance_a 和 instance_b。instance_a 将在端口 8888 上运行,而 instance_b 将在端口 8889 上运行。当用户输入 www.domain.com/instance_a 时,我首先要确保他们已通过服务器身份验证,然后要使用 mod_rewrite 将请求代理到 www.domain.com:8888/instance_a。对于 instance_b 也是如此。同样,任何用户(管理员或访客)都可以访问这些实例。如果用户尝试直接进入任一实例的 OC4j 管理面板,如果他们不是管理员用户,我要将他们踢出。

我有一个如下所示的 VirtualHost 条目:

<VirtualHost *:80>
        ServerName www.domain.com
        CustomLog "/var/log/httpd/ic/access_log" "combined"
        ErrorLog "/var/log/httpd/ic/error_log"
        RewriteEngine on
        RewriteLogLevel 9
        RewriteLog "/var/log/httpd/rewrite_log"
        RewriteCond %{REMOTE_USER} !^guest$ [OR]
        RewriteCond %{REMOTE_USER} !^admin$
        RewriteCond %{REQUEST_URI} ^/instance_a.*$
        RewriteRule ^.*$ - [F,L]
        <LocationMatch "^/.*$">
                AuthType Basic
                AuthName "Please Login"
                AuthBasicProvider file
                AuthUserFile /usr/local/apache/passwd/passwords
                Require valid-user
        </LocationMatch>
</VirtualHost>

由于某种原因,它不起作用(我并不感到惊讶)。当我同时使用身份验证和 mod_rewrite 时,它​​们似乎不能一起工作。

提前致谢。

答案1

我认为发布的配置的问题在于前两行 RewriteCond:

    RewriteCond %{REMOTE_USER} !^guest$ [OR]
    RewriteCond %{REMOTE_USER} !^admin$

如果 REMOTE_USER 为“admin”,则第一个测试成功,导致 Forbidden 响应。“guest”的情况类似。您可以尝试结合这两个测试:

    RewriteCond %{REMOTE_USER} !^(guest|admin)$

如果REMOTE_USER是guest或者admin,^(guest|admin)$则会匹配,导致整个RewriteCond失败。

答案2

不确定这是否有帮助,但您可能希望将重写条件/规则从 LocationMatch 中拉出并将其放在 LocationMatch 之前/之后。

答案3

天哪。

这尚未测试,但可能是这样的:

<VirtualHost *:80>
        ServerName www.domain.com
        CustomLog "/var/log/httpd/ic/access_log" "combined"
        ErrorLog "/var/log/httpd/ic/error_log"
        RewriteEngine on
        RewriteRule ^(/instance_a/.*) http://localhost:8888/$1 [P]
        RewriteRule ^(/instance_b/.*) http://localhost:8889/$1 [P]
        <Proxy "http://localhost:888?/">
                AuthType Basic
                AuthName "Please Login"
                AuthBasicProvider file
                AuthUserFile /usr/local/apache/passwd/passwords
                Require valid-user
        </Proxy>
        <Proxy "http://localhost:888?/instance_?/admin">
                Require group admin
        </Proxy>
</VirtualHost>

我不确定您是否需要在每个Proxy块中重复 auth 指令 - 您必须进行实验。

相关内容