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