Domanda

Mi chiedevo se fosse possibile impostare un requisito di autenticazione di base http condizionale basato sull'URL dell'host virtuale in un file .htaccess.

Ad esempio, quello che voglio fare è che mysite.com e test.mysite.com scappino dalla stessa base di codice nella stessa directory ma proteggano con password test.mysite.com.Sarebbe impostato in questo modo in modo da non dover ramificare il mio codice poiché il codice della mia app può vedere da quale vhost / url viene servito e scegliere il database da cui servire il contenuto.

È stato utile?

Soluzione

Puoi fare una sorta di kludge usando mod_setenvif insieme ai moduli mod_auth.Utilizzare la direttiva SetEnvIfNoCase per impostare quale host è protetto da password.Avrai bisogno di un paio di direttive extra per soddisfare l'accesso:

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

Quindi all'interno del blocco Directory (o semplicemente allo scoperto) hai la tua roba per l'autenticazione, qualcosa del genere:

AuthUserFile /var/www/test.mysite.com/htpasswd
AuthType Basic
AuthName "Password Protected"

Ora per quanto riguarda la richiesta / soddisfazione:

Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=!PROTECTED_HOST

Questo farà sì che qualsiasi host che non corrisponde a ^test\.mysite\.com\.?(:80)?$ avrà accesso senza bisogno di auth (Allow from env=!PROTECTED_HOST) ma altrimenti, abbiamo bisogno di un utente valido (Require valid-user).Il Satisfy any assicura che abbiamo solo bisogno di uno dei 2, Consenti o Richiedi.

Altri suggerimenti

Ho avuto problemi a implementare la soluzione di Jon: Anche se ho abbastanza familiarità con la configurazione di Apache e le espressioni regolari, l'autenticazione è sempre stata attivata.Da una rapida analisi è emerso che la riga Allow from env=!PROTECTED_HOST non si è attivata.

Ma ho trovato un'altra soluzione che in realtà mi sembra più sicura:

Ho creato due host virtuali per i due domini che puntano alla stessa radice del documento (che è completamente consentita tra l'altro).In uno dei vhost ho aggiunto le direttive per l'autenticazione di base (direttamente nel blocco della direttiva vhost).

Funziona come un fascino.E ho la sensazione migliore che questo sia davvero sicuro: nessun rischio di trascurare alcun dettaglio nel pattern regex che aprirebbe le porte agli intrusi.

<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>

Ecco una soluzione simile a quella proposta da Jon Lin, ma utilizzando RewriteCond per controllare il nome 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top