.htaccess - password - htpasswd
La contraseña protege una URL específica (7)
¿Qué hay de redirigir al usuario a una subcarpeta protegida con contraseña?
.htaccess
RewriteCond %{HTTP_COOKIE} !BadHorsie=secret_cookie_key
RewriteRule ^(pretty/url)$ /protected/login.php?url=$1 [R=307,L]
protegido / .htaccess
AuthUserFile /usr/www/{YOUR_PATH}/protected/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected"
AuthType Basic
require user BadHorsie
protected / .htpasswd
BadHorsie:$apr1$fFbaaVdF$Q5ql58g7R4qlpMUDb/5A0/
protected / login.php
<?php
if (isset($_GET[''url'']) && $_GET[''url''] && $_GET[''url''][0] != ''/'' && strpos($_GET[''url''], ''//'') === false) {
setcookie(''BadHorsie'', ''secret_cookie_key'', 0, ''/'');
header(''Location: /'' . $_GET[''url''], true, 307);
exit;
}
?>
Lo que pasa
- El usuario solicita
example.com/pretty/url
- 307 redirigir a
example.com/protected/login.php?url=pretty/url
- iniciar sesión
- en caso de éxito: el usuario obtiene la cookie de sesión con la clave secreta
- 307 redirigir a
example.com/pretty/url
- El usuario obtiene contenido secreto
Nota: Por supuesto, el mecanismo de "cookie de sesión y redireccionamiento de retorno" es totalmente opcional. Finalmente, puede protected/login.php
su contenido secreto directamente a través de protected/login.php
. Me mostré de esta manera solo por inspiración.
Opcional: No use PHP y configure la cookie a través de .htaccess.
El sitio está en alojamiento compartido. Necesito proteger con contraseña una sola URL.
http://www.example.com/pretty/url
Obviamente, esa no es una ruta de archivo física que estoy tratando de proteger, es solo esa URL en particular.
Cualquier solución rápida con .htaccess?
Como Rick dijo en un comentario que ninguna respuesta en esta pregunta funciona, aquí está el fragmento que uso:
AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null
SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth
<RequireAny>
Require env noauth
Require valid-user
</RequireAny>
Si necesita soporte para Apache 2.2 y Apache 2.4 (aparentemente hay configuraciones donde ambas versiones se ejecutan en paralelo ...):
AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null
SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth
<IfModule mod_authz_core.c>
<RequireAny>
Require env noauth
Require valid-user
</RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
Order Deny,Allow
Deny from all
Satisfy any
Require valid-user
Allow from env=noauth
</IfModule>
El código para Apache 2.2 está tomado de Jon Lin .
Debería poder hacer esto usando la combinación de mod_env y Satisfy any
directiva. Puede usar SetEnvIf
para verificar contra Request_URI
, incluso si no es una ruta física. Luego puede verificar si la variable está configurada en una declaración de Allow
. Por lo tanto, debe iniciar sesión con la contraseña o Allow
permite ingresar sin contraseña:
# Do the regex check against the URI here, if match, set the "require_auth" var
SetEnvIf Request_URI ^/pretty/url require_auth=true
# Auth stuff
AuthUserFile /var/www/htpasswd
AuthName "Password Protected"
AuthType Basic
# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# except if either of these are satisfied
Satisfy any
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_auth" var is NOT set
Allow from env=!require_auth
Lamentablemente no puedo comentar la respuesta @ jon-lin. Entonces, creo una nueva respuesta. Mi solución adaptada en un entorno apache 2.4 es:
#
# password protect /pretty/url URIs
#
AuthType Basic
AuthName ''Authentication required''
AuthUserFile /path/to/.htpasswd
# Restrict access to some urls
SetEnvIf Request_URI ^/pretty/url auth=1
<RequireAll>
# require the auth variable to be set
Require env auth
# require an valid-user
Require valid-user
</RequireAll>
Puede usar <LocationMatch>
o simplemente <Location>
dentro de su directiva <VirtualHost>
para hacer esto (suponiendo que tenga acceso a su httpd.conf / vhost.conf - alternativamente, puede poner algo similar en .htaccess en su documento raíz si tienes que configurar tu sitio de esa manera).
Por ejemplo:
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/blabla
# Other usual vhost configuration here
<Location /pretty/url>
AuthUserFile /path/to/.htpasswd
AuthGroupFile /dev/null
AuthName "Password Protected"
AuthType Basic
require valid-user
</Location>
</VirtualHost>
Puede encontrar <LocationMatch>
más útil si quiere hacer coincidir una expresión regular con su bonita URL. La documentación está here .
Todas las soluciones proporcionadas no funcionaron para mí. Me di cuenta de que las siguientes directivas hacen el truco:
SetEnvIf Request_URI ^/page-url auth=1
AuthName "Please login"
AuthType Basic
AuthUserFile "/www/live.example.com/files/html/.htpasswd"
# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auth
la solución de arriba está demasiado ocupada y mal un poco ... Voy por la simplicidad y la claridad como esta
<Files "protected.html">
AuthName "Username and password required"
AuthUserFile /home/fullpath/.htpasswd
Require valid-user
AuthType Basic
</Files>
Lo anterior debe colocarse en su archivo htaccess donde "protected.html" es el archivo que desea proteger (puede ser cualquier cosa que desee, por ejemplo myphoto.jpg o document.zip, simplemente renómbrelo a su preferencia). AuthUserFile es la ruta completa a su archivo de contraseña. Estás listo.
Aunque es posible que deba asegurarse de que se establezcan los requisitos previos para esto. AllowOverride y AuthConfig son necesarios en las configuraciones de la etiqueta del directorio Apache para que el código funcione, pero normalmente está preconfigurado, por lo que debe estar seguro y bien a menos que esté haciendo su propia compilación personalizada.