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