Использовать HTTP-аутентификацию только при доступе к определенному домену - PullRequest
10 голосов
/ 01 сентября 2009

У меня есть несколько сайтов: example.com, example1.com и example2.com. Все они указывают на папку /public_html моего сервера, которая является моей корневой папкой Apache.

Что мне нужно добавить в мой .htaccess файл, чтобы использовать http-аутентификацию, только если пользователь приходит с example2.com? example.com и example1.com НЕ должны использовать аутентификацию.

Я знаю, мне нужно что-то вроде

AuthType Basic
AuthName "Password Required"
AuthUserFile "/path/to/.htpasswd"
Require valid-user

Но я хочу запрашивать пароль, только если пользователь посещает example2.com.

Редактировать

Используя подход, предложенный в ответе, в моем файле .htaccess есть следующее:

SetEnvIfNoCase Host ^(.*)$ testauth
<IfDefine testauth>
RewriteRule ^(.*)$ index2.php?q=$1 [L,QSA]
</IfDefine>

Я знаю, что модуль mod_setenvif.c включен (я проверил с помощью блока ), но может показаться, что «testauth» никогда не определяется, потому что мой тест для проверки (перенаправление на index2.php) не выполняется (тогда как выполнялось в моем блоке). Есть идеи почему?

Ответы [ 5 ]

19 голосов
/ 25 июля 2012

Как насчет этого в файле htaccess в корне документа:

# set the "require_auth" var if Host ends with "example2.com"
SetEnvIfNoCase Host example2\.com$ require_auth=true

# Auth stuff
AuthUserFile /var/www/htpasswd
AuthName "Password Protected"
AuthType Basic

# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# except if either of these are satisfied
Satisfy any
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_auth" var is NOT set
Allow from env=!require_auth

Это сделает так, что аутентификация не требуется, если хост не оканчивается example2.com (например, www.example2.com, dev.example2.com и т. Д.). Выражение может быть изменено при необходимости. Любой другой хост приведет к тому, что require_auth var не будет установлен, поэтому аутентификация не требуется. Если это должно быть наоборот, последнюю строку можно изменить на: Allow from env=require_auth, удалив ! .

10 голосов
/ 13 декабря 2016

Apache 2.4 предлагает семантическую альтернативу с директивой If :

<If "req('Host') == 'example2.com'">
    AuthUserFile /path/to/htpasswd
    AuthType Basic
    AuthName "Password Protected"
    Require valid-user
</If>
<Else>
    Require all granted
</Else>
5 голосов
/ 25 июля 2012

Вот одна рекомендация:

Создайте файл с именем common.conf и сохраните в доступном месте

В этом файле поместите конфигурацию Apache, общую для всех сайтов (хостов).

Удаление текущей отдельной записи VirtualHost и замена ее записями VirtualHost следующим образом:

# These are the password protected hosts
<VirtualHost *:80>
ServerName example.com
ServerAlias example1.com

Include /path-to-common-configuration/common.conf

AuthType Basic
AuthName "Password Required"
AuthUserFile "/path/to/.htpasswd"
Require valid-user
</VirtualHost>

# These are hosts not requiring authentication
<VirtualHost *:80>
ServerName example2.com
ServerAlias example3.com

Include /path-to-common-configuration/common.conf

</VirtualHost>
2 голосов
/ 25 июля 2012

Интересно, поможет ли DanH подход, разрешающий доступ по IP-адресу?

Что-то вроде

SetEnvIf Remote_Addr 1\.2\.3\.4 AllowMeIn
SetEnvIfNoCase Host this\.host\.is\.ok\.com AllowMeIn
SetEnvIfNoCase Host this\.host\.is\.also\.ok\.com AllowMeIn

и затем в вашем Drupal "контейнере"

Order Allow,Deny
Allow from env=AllowMeIn

должен сделать трюк.

Любой хост, который является «живым», должен быть настроен на «AllowMeIn», иначе вы должны исходить из известного IP-адреса (т.е. вы и другие разработчики).

1 голос
/ 01 сентября 2009

Вы не должны помещать конфигурацию для каждого vhost в .htaccess. Вместо этого поместите блок конфигурации в блок VirtualHost в соответствующий файл конфигурации в /etc/apache/sites-enabled/*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...