Назад | Перейти на главную страницу

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

Мне нужно убедиться, что мой 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, они не работают вместе.

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

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

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

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

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

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

Вот это да.

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

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

Я не уверен, нужно ли дублировать директивы auth в каждом Proxy блок - придется поэкспериментировать.

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