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

98

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 varios 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}?

DssTrainer
fuente

Respuestas:

51

No es posible utilizar 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), se trata como relativo al ServerRoot.

Tienes que aceptar y solucionar esa limitación.


Estamos usando IfDefinejunto con un parámetro de línea de comando apache2 :

.htaccess (adecuado para sistemas de desarrollo y 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

Reinicie su apache después y obtendrá una solicitud de contraseña solo cuando no esté en el servidor de desarrollo.

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

cweiske
fuente
4
Pero esto todavía usa una ruta absoluta ( /var/...) - y la pregunta pregunta: "¿cómo usar una ruta relativa"?
sdaau
1
Y luego se editó la pregunta para responder correctamente con un "no" :)
Erenor Paz
15

Por si acaso la gente está 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>
mask8
fuente
1
Esto sería genial, pero ¿es seguro confiar en él? req('Host')¿No puede el cliente engañar a este valor?
Marco Demaio
1
@MarcoDemaio Sí, puede / podría ser engañado usando, por ejemplo, la dirección IP. Depende de tu configuración. No es un sí o un no absoluto. Depende.
Maxime
12

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

2) Los documentos dicen esto sobre las 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), se trata como relativo al ServerRoot .

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

En proyectos Java, uso Maven para hacer este tipo de trabajo, por ejemplo, proyectos PHP, me gusta tener un script de shell build.sh y / o install.sh que sintonice los archivos implementados en su entorno. Esto desacopla su base de código de los detalles 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, es posible que tenga problemas una vez que el entorno también tenga que atender a diferentes aplicaciones o requisitos específicos del sistema que no guarden relación alguna.

Hanno Fietz
fuente
8

puede poner su configuración de autenticación 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>

La autenticación está funcionando, pero no pude hacer que mi entorno funcionara realmente.

burro digital
fuente
1
Creo que el problema es el siguiente: "Solo las variables de entorno definidas por las directivas SetEnvIf [NoCase] ​​anteriores están disponibles para probar de esta manera. 'Anterior' significa que se definieron en un ámbito más amplio (como en todo el servidor) o previamente en alcance de la directiva actual ". (que se encuentra aquí: askapache.com/htaccess/setenvif.html ) Debido a que tiene el mismo alcance, no podría ejecutar su entorno.
user470370
4
por qué esto no funciona es excepcionalmente bueno explicado aquí stackoverflow.com/questions/11073752/…
nico gawenda
Pero esto todavía usa una ruta absoluta ( /Users/...) - y la pregunta pregunta: "¿cómo usar una ruta relativa"?
sdaau
Si. Pero puede usar múltiples configuraciones APPLICATION_ENV para usar múltiples rutas absolutas por entorno.
digitaldonkey
5

.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á funcionando el script básico auth .htaccess.

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

Antes de iniciar sesión

ingrese la descripción de la imagen aquí

Iniciar sesión Afetr

ingrese la descripción de la imagen aquí

muni
fuente
3

Si está intentando usar XAMPP con Windows y desea 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 servicio.

  • Esto se hace abriendo el Panel de control de 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 servicio.
  • Entonces debería convertirse en una marca de verificación verde.

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

  • Primero, detenga el servicio Apache desde el Panel de control de XAMPP.
  • A continuación, abra un símbolo del sistema. (Conoces la pequeña ventana negra que simula 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) Inicie Apache

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

4) Cree su 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 script anterior, aquí hay algunas notas ...

  • Mi AuthUserFile se basa en mi configuración y preferencias personales.
  • Tengo una caja 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 utiliza para esa instancia. Si DEV está configurado (que es lo que hicimos anteriormente, solo en la máquina de desarrollo de Coarse), usará esa entrada.
  • Y a su vez, si se usa el servidor en vivo, se usará 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 a tener en cuenta ...

Arvo Bowen
fuente
Pero esto todavía usa una ruta absoluta ( /home...) - y la pregunta pregunta: "¿cómo usar una ruta relativa"?
sdaau
2

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

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

Sé que esta es una pregunta antigua, pero acabo de buscar lo mismo y probablemente hay muchos otros que buscan una solución móvil rápida. 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>
ovi
fuente
Pero esto todavía usa una ruta absoluta ( /var...) - y la pregunta pregunta: "¿cómo usar una ruta relativa"?
sdaau
1
Sí, es una solución alternativa, porque Apache no admite rutas relativas a la ubicación del .htaccessarchivo. Si tuviera que usar una ruta relativa, se consideraría relativa a ServerRoot.
ovi
1

Pongamos 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 document_root .

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

document_root es / var / www / myApp

server_root es / etc / apache2 // (solo en nuestro ejemplo, porque usamos el servidor 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 de archivo relativa 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, utilizar un enlace físico en lugar de un símbolo o copiar un archivo a su raíz_servidor .

Sild
fuente
1
Dado que Apache bloquea el acceso a archivos que comienzan con .ht * de forma predeterminada, no se recomienda usar nombres aleatorios para ellos.
cari