.htaccess autenticazione di base da host virtuale?
-
27-10-2019 - |
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.
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