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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top