2010-11-01 13 views
19

Tenemos servidores locales, servidores centrales de desarrollo, almacenamiento y producción. Sin embargo, el desarrollador y la puesta en escena están protegidos por contraseña por razones obvias. Entonces, después de implementar cualquier cambio en el htaccess, tengo que editar manualmente el archivo htaccess para habilitar la protección con contraseña en el servidor de desarrollo y transferencia.Bloques de código específicos de nombre de dominio en htaccess

¿Hay alguna manera de tener bloques condicionales en función del nombre de dominio como:

if ($domain == "dev.example.com" || $domain == "staging.example.com"){ 
    AuthName "Password Protected Area" 
    AuthType Basic 
    AuthUserFile /somewhere/.htpasswd 
    Require valid-user 
} 

Necesito encontrar el .htaccess equivalente de la condición:

if ($domain == "dev.example.com" || $domain == "staging.example.com"){ 

} 

le agradecería la ayuda o consejos que ustedes pueden dar.

Respuesta

28

mientras lo hace a través del host virtual y no un .htaccess es mucho mejor, puede utilizar la siguiente solución si el módulo está activo SetEnvIf:

SetEnvIf Host ^dev\.site\.com$ is_on_dev_site 
SetEnvIf Host ^staging\.site\.com$ is_on_dev_site 
Order deny,allow 
Deny from env=is_on_dev_site 
# require password if access would otherwise be denied 
Satisfy any 
# Put your password auth stuff here 

También puede hacerlo con una lista blanca que es probablemente mejor, ya que asegura que sus sitios dev todavía están protegidos incluso si alguien decide permitir el acceso a ellos a través de www.dev.site.com etc .:

SetEnvIf Host ^site\.com$ is_on_public_site 
SetEnvIf Host ^www\.site\.com$ is_on_public_site 
Order deny,allow 
Deny from all 
Allow from env=is_on_public_site 
Satisfy any 
# Put your password auth stuff here 

Si usted no tiene mod_setenvif en su servidor, también puede mod_rewrite hacer el trabajo por usted (reemplace los bloques SetEnvIf en el ejemplo de lista blanca con la siguiente):

RewriteEngine On 
RewriteCond %{HTTP_HOST} =site.com 
RewriteRule^- [E=is_on_public_site:yes] 
RewriteCond %{HTTP_HOST} =www.site.com 
RewriteRule^- [E=is_on_public_site:yes] 
+0

Solo un aviso con respecto a la seguridad: HTTP_HOST es proporcionado por el cliente, y es spoofable. Además, algunos proxies eliminarán el valor por lo que ni siquiera puedes confiar en que esté presente. Debes usar SERVER_NAME que proporciona el servidor. – Andri

+3

Cuando se trata de hosts virtuales basados ​​en nombres, no creo que HTTP_HOST sea falso.O para ser más exactos, es factible por supuesto, pero luego la solicitud nunca llegará a su destino previsto. – ThiefMaster

+0

Entonces, si la solicitud viene con un HTTP_HOST que no coincide con ninguno de los hosts virtuales, no va a ninguna parte. – Andri

1

Usted debe hacer esto en sus sitios conf con:

<VirtualHost domain.com:80> 

...config statements here 

</VirtualHost> 

y

<VirtualHost domain2.com:80> 

....config statements here 

</VirtualHost> 

Si estás con un anfitrión que no le permite editar sus sitios fichero de configuración, la cual es una posibilidad real si está con un host compartido, entonces debería considerar VPS o hosting dedicado.

+1

puedo hacer esto, sin embargo, no quiero hacer ese tipo de cambios en todos los servidores ... ¡soy flojo! :) –

5

he encontrado una buena solución, para distinguir "localhost" frente a "vivo":

Desde los condicionales de .htaccess son algo limitadas por qué no conformarse con IfModule? : Compare los módulos que tiene (es decir, usar, y buscar una diferencia significativa, con suerte a largo plazo, p. si desarrolla en Windows y despliega en linux, mod_win32.c podría ser bueno. (No se olvide de añadir el cual .c phpinfo() ommits.)

entonces usted puede ir en ello como esto (probado):

<IfModule mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLocal=1 
</IfModule> 
<IfModule !mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLive=1 
</IfModule> 

Este ejemplo hace que para una buena salud mental de prueba, browing a su dominio/banana resp. localhost/banana y si (habiendo reescrito habilitado) vuelca la matriz $ _GET en test.php. Si esto funciona, completa los códigos con tus instrucciones de configuración reales.

+0

¡Muy buen hallazgo, gracias! – ciscoheat

Cuestiones relacionadas