.htaccess базовый auth с помощью виртуального хоста?
Мне было интересно, можно ли настроить условное требование HTTP basic auth на основе URL-адреса виртуального хоста в файле .htaccess.
Например, я хочу, чтобы mysite.com и test.mysite.com запустили одну и ту же базу кода в том же каталоге, но защитили паролем test.mysite.com. Он будет настроен таким образом, чтобы мне не нужно было разветвлять мой код, так как код приложения может видеть, какой из них vhost/url он обслуживается, и выберите базу данных для обслуживания контента.
Ответы
Ответ 1
Вы можете отсортировать это с помощью mod_setenvif
вместе с модулями mod_auth
. Используйте директиву SetEnvIfNoCase
, чтобы установить, какой хост защищен паролем. Для удовлетворения доступа вам потребуется несколько дополнительных директив:
# Check for the hostname here
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST
Затем внутри блока Directory
(или просто в открытом виде) у вас есть настройка вашего файла auth, что-то вроде этого:
AuthUserFile /var/www/test.mysite.com/htpasswd
AuthType Basic
AuthName "Password Protected"
Теперь для запроса/удовлетворения материала:
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!PROTECTED_HOST
Это сделает так, чтобы любой хост, который не соответствует ^test\.mysite\.com\.?(:80)?$
, получит доступ без необходимости auth (Allow from env=!PROTECTED_HOST
), но в противном случае нам нужен действительный пользователь (Require valid-user
). Satisfy any
гарантирует, что нам просто нужно одно из двух: Разрешить или требовать.
Ответ 2
У меня были проблемы с внедрением решения Jon:
Хотя я хорошо знаком с Apache conf и регулярными выражениями, аутентификация всегда срабатывает. Из быстрых анализов казалось, что линия Allow from env=!PROTECTED_HOST
не вкололась.
Но я нашел другое решение, которое на самом деле выглядит более безопасным для меня:
Я создал два виртуальных хоста для двух доменов, указывающих на тот же самый корень документа (который полностью разрешен кстати). В одном из vhosts я добавил директивы для базового auth (непосредственно в директивный блок vhost).
Работает как шарм. И у меня есть лучшее чувство, что это действительно безопасно - нет риска игнорировать любые детали в шаблоне регулярных выражений, которые откроют ворота для злоумышленников.
<VirtualHost *:80>
ServerName www.mysite.com
DocumentRoot "/path/to/common/doc/root"
<Directory "/path/to/common/doc/root">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName protected.mysite.com
DocumentRoot "/path/to/common/doc/root"
<Directory "/path/to/common/doc/root">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
AuthUserFile /path/to/htpasswd
AuthName "Password please"
AuthType Basic
Require valid-user
</Directory>
</VirtualHost>
Ответ 3
Здесь решение, аналогичное тому, что предложил Jon Lin, но используя RewriteCond
для проверки имени хоста:
RewriteEngine On
RewriteCond %{HTTP_HOST} =protected.hostname.com
RewriteRule ^.*$ - [E=DENY:1]
AuthUserFile /path/to/htpasswd
AuthName "Password please"
AuthType Basic
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!DENY