.htaccess autenticação básica por host virtual?
-
27-10-2019 - |
Pergunta
Eu queria saber se seria possível configurar um requisito de autenticação básica de http condicional com base na URL do host virtual em um arquivo .htaccess.
Por exemplo, o que eu quero fazer é fazer com que meusite.com e test.mysite.com executem a mesma base de código no mesmo diretório, mas com senha protegendo test.mysite.comSeria configurado dessa forma para que eu não precisasse ramificar meu código, pois o código do meu aplicativo pode ver de qual vhost / url está sendo servido e escolher o banco de dados para servir o conteúdo.
Solução
Você pode eliminar isso usando mod_setenvif
junto com os módulos mod_auth
.Use a diretiva SetEnvIfNoCase
para definir qual host é protegido por senha.Você precisará de algumas diretivas extras para satisfazer o acesso:
# Check for the hostname here
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST
Então, dentro do bloco Directory
(ou apenas aberto), você tem seu material de autenticação configurado, algo como isto:
AuthUserFile /var/www/test.mysite.com/htpasswd
AuthType Basic
AuthName "Password Protected"
Agora, para as coisas de exigir / satisfazer:
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!PROTECTED_HOST
Isso fará com que qualquer host que não corresponda ao ^test\.mysite\.com\.?(:80)?$
tenha acesso sem a necessidade de autenticação (Allow from env=!PROTECTED_HOST
), mas caso contrário, precisamos de um usuário válido (Require valid-user
).O Satisfy any
garante que precisamos apenas de um dos 2, Permitir ou Requerer.
Outras dicas
Tive problemas para implementar a solução de Jon:
Embora eu esteja bastante familiarizado com o Apache conf e expressões regulares, a autenticação sempre disparou.Em uma análise rápida, parecia que a linha Allow from env=!PROTECTED_HOST
não funcionou.
Mas encontrei outra solução que realmente me parece mais segura:
Criei dois hosts virtuais para os dois domínios apontando para a mesma raiz do documento (o que é totalmente permitido, a propósito).Em um dos vhosts, adicionei as diretivas para autenticação básica (diretamente no bloco de diretivas vhost).
Funciona perfeitamente.E tenho uma sensação melhor de que isso é realmente seguro - não há risco de ignorar quaisquer detalhes no padrão regex que abriria as portas para intrusos.
<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>
Aqui está uma solução semelhante à proposta de Jon Lin, mas usando RewriteCond
para verificar o nome do host:
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