.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 ...
- Su archivo de contraseña puede ser cualquier nombre que desee.
- Deberías usar .htpasswd para seguridad.
- Un gran generador de contraseñas encontrado @ http://www.htaccesstools.com/htpasswd-generator/
- Una gran explicación y la razón por la que debe usar ese nombre para su archivo se encuentra @http: http://www.htaccesstools.com/articles/htpasswd/
- ¡ASEGÚRESE DE PONER EL ARCHIVO DE CONTRASEÑA EN LA UBICACIÓN CORRECTA! (Consulte el paso 4 Área AuthUserFile)
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.