2011-09-07 23 views
11

Me preguntaba si era posible configurar un requisito HTTP auth condicional basado en la URL del host virtual en un archivo .htaccess..htaccess autenticación básica por el host virtual?

Por ejemplo, lo que quiero hacer es tener mysite.com y test.mysite.com ejecutando la misma base de código en el mismo directorio, pero proteger con contraseña test.mysite.com. Se configuraría de esta manera para que no tuviera que bifurcar mi código, ya que mi código de aplicación puede ver a qué vhost/url se está enviando y elegir la base de datos para publicar el contenido.

Respuesta

19

Puede clasificar esto usando mod_setenvif junto con los módulos mod_auth. Use la directiva SetEnvIfNoCase para establecer qué host está protegido por contraseña. Usted necesitará un par de directivas adicionales para satisfacer el acceso:

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

Entonces el interior del bloque Directory (o simplemente a la intemperie) que tiene la configuración de autenticación cosas, algo como esto:

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

Ahora para el requeriría/satisfacer cosas:

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

Esto hará que sea por lo que cualquier host que no coincide con ^test\.mysite\.com\.?(:80)?$ tendrán acceso sin necesidad de autenticación (Allow from env=!PROTECTED_HOST) pero, de lo contrario, necesitamos un usuario válido (Require valid-user). El Satisfy any asegura que solo necesitamos uno de los 2, ya sea Permitir o Requerir.

+0

Estoy tratando de activar un caso condicional pero use para probarlo, pero no funciona. ¿Algunas ideas? .. Estoy usando: SetEnvIfNoCase Host "dev.example.com" DEV ... y luego para el caso 'dev' y para el sitio 'normal' ... – DM8

+0

@ DM8 Eso no es lo que hace [] (http://httpd.apache.org/docs/2.2/mod/core.html#ifdefine). Esas variables son establecidas por el indicador de línea de comando '-D'. No son variables de entorno. –

+0

hmm, entonces aparte de esperar a que mi host actualice a Apache 2.4 (que tiene el bloque ...). ¿Hay alguna forma de obtener el comportamiento que estaba esperando? ... en mis búsquedas encontré el siguiente artículo, que parece indicar que no hay _no_ forma de hacerlo en Apache 2.2x: http: //turboflash.wordpress.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/ – DM8

5

he aquí una solución similar a lo que Jon Lin propuso, pero utilizando RewriteCond para comprobar el nombre de 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 
12

tuve problemas para implementar una solución de Jon: Aunque estoy bastante familiarizado con configuración del Apache y expresiones regulares, la autenticación siempre disparada Desde una rápida analiza parecía que la línea Allow from env=!PROTECTED_HOST no entran en juego

pero he encontrado otra solución que en realidad se parece más seguro para mí:.

creé dos hosts virtuales para los dos dominios que apuntan a la misma raíz del documento (que está completamente permitido por cierto). En uno de los fantasmas, agregué las directivas para autenticación básica (directamente en el bloque de directivas vhost).

Funciona como un encanto. Y tengo una mejor sensación de que esto es realmente seguro, sin riesgo de pasar por alto ningún detalle en el patrón de expresiones regulares que abriría las puertas a los 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> 
+2

Esta es la forma ** correcta ** de hacerlo. Si necesita configurar 2 vhosts de manera diferente, configure 2 vhosts. La solución hacky con env var y 'satisfy any' solo debería aplicarse si tu hosting no te da acceso a la configuración de vhost/server y te queda una solución .htaccess. –