condicionales htaccess
-
29-09-2020 - |
Pregunta
Configuré la autenticación htpasswd en mi sitio en vivo y funciona muy bien, pero no quiero que me pidan una contraseña cuando estoy trabajando en el entorno de desarrollo.
En mi archivo httpd.conf tengo:
SetEnv APP_ENV "development"
En mi .htaccess
archivo que tengo:
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user
Me preguntaba si había alguna forma de poner un condicional alrededor de htppasswd para que cuando APP_ENV
es development
que no me piden una contraseña.
es posible?
Solución
Si puede, debería pensar en actualizar a Apache 2.4 (o la última versión beta 2.3 ya que la 2.4 aún no se ha lanzado).
Una de las nuevas funciones disponibles es Contenedores de autorización - haciendo que sea mucho más sencillo definir los requisitos de acceso utilizando el Requerir directiva.
Deberías terminar con algo como:
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /path/to/file/groups
SetEnv APP_ENV "development"
<RequireAll>
<RequireAny>
<RequireAll>
#main requirements
Require group user
#other conditions if needed for non-dev/non-local
</RequireAll>
<RequireAll>
#allow direct if development
Require env APP_ENV development
</RequireAll>
<RequireAll>
<RequireAny>
#allow loopback and local network
Require ip 127.0.0.1
Require ip 10.2
</RequireAny>
</RequireAll>
<RequireAny>
#other conditions if needed for everyone
<RequireNone>
#blacklist
</RequireNone>
</RequireAll>
Otros consejos
Una de las formas de construir bloques condicionales if con variables env es usar mod_macro módulo.Hice un ejemplo anteriormente aquí.
En este caso particular, tendría encima del archivo VirtualHost (antes de la definición de VirtualHost):
<Macro ConditionalBlockMacroSecurity_production>
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user
</Macro>
<Macro ConditionalBlockMacroSecurity_development >
<IfModule mod_headers.c>
Header set MyHeader "Hello this is DEVELOPMENT envirronment. It took %D microseconds for Apache to serve this request."
</IfModule>
</Macro>
Y dentro del Virtualhost:
Use ConditionalBlockMacroSecurity_${APP_ENV}
donde la ruta al archivo htpassword también podría establecerse como parámetro de la macro.
La desventaja de esta solución es que necesita instalar mod_macro en el servidor de producción, no es un módulo instalado comúnmente y necesitará cierto control del entorno de producción para hacerlo.Por otro lado, una solución sencilla es tener varias versiones de sus servidores virtuales dependiendo del entorno y agregar algunos comentarios en la sección Auth.Pero si está buscando una solución genérica, ciertamente significa que es un problema recurrente y desea evitar la edición manual de archivos, en tales casos mod_macro puede convertirse en una forma muy profesional de capitalizar sus experiencias con Apache, hasta que sus configuraciones de Apache se conviertan en una única macro. con parámetros, llamando a muchas otras macros.
Los condicionales en la configuración de Apache funcionan solo una vez, cuando se [re]carga la configuración.
Lo que haría es crear un segundo VirtualHost con el mismo directorio raíz y controlar el acceso usando Denegar/Permitir según la dirección IP allí.
Agregue lo siguiente:
Require valid-user
Allow from <dev IP>
Satisfy Any
Esto requerirá que Require valid-user
o Allow from <dev IP>
aplica.
En tus .htaccess
archivo puede anidar los bloques dentro de la directiva IfDefine, como:
<IfDefine PROD>
bla bla bla
</IfDefine>
Entonces asegúrate de pasar -D PROD
como argumento cuando inicias apache.Esta sección solo se ejecutará si se define PROD.En Ubuntu puedes hacer esto, por ejemplo, editando /etc/apache2/envvars
y añadiendo esta línea al final:
export APACHE_ARGUMENTS="-D PROD"
Puedes "invertirlo" quizás usando algo como <IfDefine !DEV>
ejecutar solo cuando no sea el entorno de desarrollo, y luego pasar -D DEV en ese entorno y dejar los sitios de producción como están sin tener que editar envvars.
¡Modifique en consecuencia para satisfacer sus necesidades!