.htaccess .htpasswd

.htaccess - ¿Cómo usar una ruta RELATIVA con AuthUserFile en htaccess?



.htpasswd (9)

.htpasswd requiere una ruta absoluta completa desde la raíz absoluta del servidor.

Obtenga la ruta absoluta completa del archivo por echo echo $_SERVER[''DOCUMENT_ROOT'']; .

aquí está trabajando el auth .htaccess script básico.

AuthType Basic AuthName "Access to the Hidden Files" AuthUserFile ''C:/xampp/htdocs/ht/.htpasswd'' Require valid-user

Antes de iniciar sesión

Afetr Login

Tengo un .htaccess que usa autenticación básica. Parece que la ruta al archivo .htpasswd no es relativa al archivo htaccess, sino a la configuración del servidor.

Entonces, aunque tengo los archivos .htaccess y .htpasswd en el mismo directorio, esto no funciona:

AuthType Basic AuthName "Private Login" AuthUserFile .htpasswd Require valid-user

Sin embargo, funciona si cambio AuthUserFile para usar la ruta absoluta:

AuthType Basic AuthName "Private Login" AuthUserFile "/home/user/public_html/mydir/.htpasswd" Require valid-user

Pero preferiría algo más móvil ya que lo uso en múltiples sitios en diferentes áreas. He buscado en la web pero no he tenido ninguna resolución. ¿Es posible usar una ruta relativa o variables como %{DOCUMENT_ROOT} ?


1) Tenga en cuenta que se considera inseguro tener el archivo .htpasswd debajo de la raíz del servidor.

2) Los docs dicen esto sobre rutas relativas, por lo que parece que no tienes suerte:

File-path es la ruta al archivo de usuario. Si no es absoluto (es decir, si no comienza con una barra inclinada), se trata como relativo a ServerRoot .

3) Si bien las respuestas que recomiendan el uso de variables de entorno funcionan perfectamente bien, prefiero poner un marcador de posición en el archivo .htaccess , o tener diferentes versiones en mi base de código, y hacer que el proceso de implementación lo configure todo (es decir, reemplazar marcadores de posición o cambiar el nombre / mover el archivo apropiado).

En los proyectos de Java, utilizo Maven para hacer este tipo de trabajo, por ejemplo, en proyectos de PHP. Me gusta tener un script de shell build.sh y / o install.sh que sintonice los archivos desplegados en su entorno. Esto desacopla su base de código de las características específicas de su entorno de destino (es decir, sus variables de entorno y parámetros de configuración). En general, la aplicación debe adaptarse al entorno, si lo hace al revés, puede tener problemas una vez que el entorno también tenga que atender diferentes aplicaciones o requisitos del sistema no relacionados por completo.


No es posible usar rutas relativas para AuthUserFile :

File-path es la ruta al archivo de usuario. Si no es absoluto (es decir, si no comienza con una barra inclinada), se trata como relativo a ServerRoot .

Tienes que aceptar y trabajar en torno a esa limitación.

Estamos utilizando IfDefine junto con un parámetro de línea de comando apache2:

.htaccess (adecuado tanto para sistemas de desarrollo como para sistemas en vivo):

<IfDefine !development> AuthType Basic AuthName "Say the secret word" AuthUserFile /var/www/hostname/.htpasswd Require valid-user </IfDefine>

Configuración del servidor de desarrollo (Debian)

Agregue lo siguiente a /etc/apache2/envvars :

export APACHE_ARGUMENTS=-Ddevelopment

Reinicia tu apache luego y obtendrás una solicitud de contraseña solo cuando no estés en el servidor de desarrollo.

Por supuesto, puede agregar otro IfDefine para el servidor de desarrollo, simplemente copie el bloque y elimine el ! .


Por si acaso las personas están buscando una solución para esto:

<If "req(''Host'') = ''www.example.com''"> Authtype Basic AuthName "user and password" AuthUserFile /var/www/www.example.com/.htpasswd Require valid-user </If>


Sé que esta es una vieja pregunta, pero solo busqué lo mismo y probablemente haya muchos otros buscando una solución rápida y móvil. Esto es lo que finalmente se me ocurrió:

# We set production environment by default SetEnv PROD_ENV 1 <IfDefine DEV_ENV> # If ''DEV_ENV'' has been defined, then unset the PROD_ENV UnsetEnv PROD_ENV AuthType Basic AuthName "Protected Area" AuthUserFile /var/www/foo.local/.htpasswd Require valid-user </IfDefine> <IfDefine PROD_ENV> AuthType Basic AuthName "Protected Area" AuthUserFile /home/foo/public_html/.htpasswd Require valid-user </IfDefine>


Si está intentando usar XAMPP con Windows y quiere usar un archivo .htaccess en un servidor en vivo y también desarrollar en una máquina de desarrollo XAMPP, ¡lo siguiente funciona muy bien!

1) Después de una nueva instalación de XAMPP, asegúrese de que Apache esté instalado como un servicio.

  • Esto se hace abriendo el Panel de control XAMPP y haciendo clic en la pequeña "X" roja a la izquierda del módulo Apache.
  • Luego le preguntará si desea instalar Apache como un servicio.
  • Entonces debería convertirse en una marca de verificación verde.

2) Cuando Apache se instala como un servicio, agregue una nueva variable de entorno como indicador.

  • Primero detenga el servicio Apache desde el Panel de control de XAMPP.
  • Luego abra un símbolo del sistema. (Ya sabes, la pequeña ventana negra simula el DOS)
  • Escriba "C: / Archivos de programa (x86) / xampp / apache / bin / httpd.exe" -D "DEV" -k config .
  • Esto agregará un nuevo indicador DEV a las variables de entorno que puede usar más adelante.

3) Comience Apache

  • Abra una copia de seguridad del Panel de control de XAMPP e inicie el servicio de Apache.

4) Crea tu archivo .htaccess con la siguiente información ...

<IfDefine DEV> AuthType Basic AuthName "Authorized access only!" AuthUserFile "/sandbox/web/scripts/.htpasswd" require valid-user </IfDefine> <IfDefine !DEV> AuthType Basic AuthName "Authorized access only!" AuthUserFile "/home/arvo/public_html/scripts/.htpasswd" require valid-user </IfDefine>

Para explicar el guión anterior aquí hay algunas notas ...

  • My AuthUserFile se basa en mi configuración y preferencias personales.
  • Tengo un cuadro de desarrollo de prueba local que tiene mi página web ubicada en c: / sandbox / web / . Dentro de esa carpeta tengo una carpeta llamada scripts que contiene el archivo de contraseña .htpasswd .
  • La primera entrada IfDefine DEV se usa para esa instancia. Si se establece DEV (que es lo que hicimos arriba, solo en la máquina de desarrollo de grueso) entonces usará esa entrada.
  • Y a su vez si se usa el servidor en vivo IfDefine! DEV .

5) Cree su archivo de contraseña (en este caso llamado .htpasswd) con la siguiente información ...

usuario: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Algunas cosas para tener en cuenta ...


Tomemos un ejemplo.

Su aplicación se encuentra en / var / www / myApp en algún servidor Linux

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Puede usar cualquier nombre para el archivo .htpasswd )

Para usar la ruta relativa en .htaccess :

AuthType Digest AuthName myApp AuthUserFile "htpasswdApp" Require valid-user

Pero buscará el archivo en el directorio raíz_servidor . No en raíz_de_documento .

En el caso, cuando la aplicación se encuentra en / var / www / myApp :

document_root es / var / www / myApp

raíz_de_servidor es / etc / apache2 // (solo en nuestro ejemplo, debido a que usamos el servidor de Linux )

Puede redefinirlo en su archivo de configuración de apache ( /etc/apache2/apache2.conf ), pero supongo que es una mala idea.

Entonces, para usar la ruta relativa del archivo en su /var/www/myApp/.htaccess debe definir el archivo de la contraseña en su raíz_servidor .

Prefiero hacerlo siguiendo el comando:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Puede copiar mi comando, usar un enlace fijo en lugar de un símbolo o copiar un archivo en su raíz_de_servidor .


o si desarrolla en localhost (solo para apache 2.4+):

<If "%{REMOTE_ADDR} != ''127.0.0.1''"> </If>


puede poner sus configuraciones de Auth en un entorno. Me gusta:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development <IfDefine !APPLICATION_ENV> Allow from all AuthType Basic AuthName "My Testseite - Login" AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd Require user username </IfDefine>

El Auth está funcionando, pero no pude lograr que mi entorno realmente funcionara.