Подтвердить что ты не робот

.htaccess базовый auth с помощью виртуального хоста?

Мне было интересно, можно ли настроить условное требование HTTP basic auth на основе URL-адреса виртуального хоста в файле .htaccess.

Например, я хочу, чтобы mysite.com и test.mysite.com запустили одну и ту же базу кода в том же каталоге, но защитили паролем test.mysite.com. Он будет настроен таким образом, чтобы мне не нужно было разветвлять мой код, так как код приложения может видеть, какой из них vhost/url он обслуживается, и выберите базу данных для обслуживания контента.

4b9b3361

Ответ 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