.htaccess базовая аутентификация на виртуальном хосте? - PullRequest
11 голосов
/ 07 сентября 2011

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

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

Ответы [ 3 ]

19 голосов
/ 18 сентября 2011

Вы можете сортировать это, используя mod_setenvif вместе с модулями mod_auth.Используйте директиву SetEnvIfNoCase, чтобы указать, какой хост защищен паролем.Вам понадобится пара дополнительных директив для удовлетворения доступа:

# Check for the hostname here
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST

Затем внутри блока Directory (или просто в открытом виде) у вас есть настройки аутентификации, что-то вроде этого:

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)?$, будет иметь доступ без необходимости авторизации (Allow from env=!PROTECTED_HOST) но в противном случае нам нужен действительный пользователь (Require valid-user).Satisfy any гарантирует, что нам просто нужен один из 2, либо Разрешить, либо Требовать.

12 голосов
/ 15 июня 2012

У меня были проблемы с реализацией решения Джона: хотя я хорошо знаком с Apache conf и регулярными выражениями, аутентификация всегда срабатывает.Из быстрого анализа выглядело, как будто строка Allow from env=!PROTECTED_HOST не срабатывает.

Но я нашел другое решение, которое на самом деле выглядит мне безопаснее:

Я создал два виртуальных узла для двух доменовуказывая на тот же корень документа (что, кстати, вполне допустимо).В одном из vhosts я добавил директивы для базовой аутентификации (прямо в блок директив 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>
5 голосов
/ 18 сентября 2011

Вот решение, аналогичное предложенному Джоном Линем, но с использованием 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
...