Использование Mod_rewrite и Аутентификация на ВСЕХ входящих URL

Мне нужно убедиться, что мой URL, назовите его www.domain.com, всегда защищен, по крайней мере, с помощью обычной HTTP-аутентификации. Также я хочу использовать mod_rewrite для отправки моих пользователей одному из двух экземпляров OC4j, запущенных на моем сервере. Я также хочу защитить мою панель администратора OC4j (и другие функции типа администратора) с помощью той же аутентификации. У меня будет 2 пользователя, назовем их admin (администратор будет иметь доступ как к экземплярам OC4j, так и к административной панели OC4j) и guest (guest будет иметь доступ только к экземплярам 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, они не работают вместе.

Заранее спасибо.

3 ответа

Я считаю, что проблема с конфигурацией в том виде, в каком она была опубликована, это первые две строки RewriteCond:

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

Если REMOTE_USER имеет значение "admin", первый тест завершается успешно, вызывая запрещенный ответ. Случай для "гостя" похож. Вы можете попробовать объединить два теста:

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

Если REMOTE_USER - гость или администратор, ^(guest|admin)$ будет совпадать, что приведет к сбою всего RewriteCond.

Не уверен, поможет ли это или нет, но вы можете извлечь свои Условия / Правила перезаписи из LocationMatch и поместить его до / после LocationMatch.

Вот это да.

Это не проверено, но, возможно, что-то вроде:

<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 блок - вам придется экспериментировать.

Другие вопросы по тегам