Protection par mot de passe D'une URL spécifique
le site est sur l'hébergement partagé. Je dois protéger par mot de passe une URL unique.
http://www.example.com/pretty/url
évidemment ce n'est pas un chemin de fichier physique que j'essaie de protéger, c'est juste cette URL particulière.
toute solution rapide avec .htaccess?
7 réponses
vous devriez pouvoir le faire en utilisant la combinaison de mod_env et de Satisfy any
la directive. Vous pouvez utiliser SetEnvIf
à vérifier par rapport à la Request_URI
, même si ce n'est pas un chemin d'accès physique. Vous pouvez ensuite vérifier si la variable est définie dans Allow
déclaration. Alors soit vous devez vous connecter avec mot de passe, soit le Allow
vous permet d'entrer sans mot de passe:
# 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
Vous pouvez utiliser <LocationMatch>
ou tout simplement <Location>
à l'intérieur de votre <VirtualHost>
directive pour faire ceci (en supposant que vous avez accès à votre httpd.conf / vhost.conf-alternativement vous pouvez mettre quelque chose de similaire dans un .htaccess dans votre document root si vous devez configurer votre site de cette façon).
Par exemple:
<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>
Vous pourriez trouver <LocationMatch>
plus utile si vous voulez faire correspondre une expression régulière à votre jolie URL. La documentation est ici.
toutes les solutions fournies n'ont pas fonctionné pour moi. J'ai compris à la suite des directives faire l'affaire:
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
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 vous avez besoin de support pour Apache 2.2 et Apache 2.4 (apparemment il y a des configurations où les deux versions fonctionnent en parallèle...):
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>
le code D'Apache 2.2 est tiré de Jon Lin.
#
# 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>
quid de rediriger l'utilisateur vers un sous-dossier protégé par mot de passe?
.htaccess
RewriteCond %{HTTP_COOKIE} !BadHorsie=secret_cookie_key
RewriteRule ^(pretty/url)$ /protected/login.php?url= [R=307,L]
protégé/.htaccess
AuthUserFile /usr/www/{YOUR_PATH}/protected/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected"
AuthType Basic
require user BadHorsie
protégé/.htpasswd
BadHorsie:$apr1$fFbaaVdF$Q5ql58g7R4qlpMUDb/5A0/
protégé / 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;
}
?>
Ce qui se passe
- demandes des utilisateurs
example.com/pretty/url
- 307 rediriger vers
example.com/protected/login.php?url=pretty/url
- login
- sur le succès: l'utilisateur obtient le cookie de session avec secret clé
- 307 de redirection
example.com/pretty/url
- L'utilisateur obtient du contenu secret
Note: Bien sûr, le mécanisme "cookie de session et rétro-redirection" est entièrement optionnel. Enfin, vous pouvez servir votre contenu secret directement à travers protected/login.php
. J'ai montré ce chemin seulement pour l'inspiration.
optionnel: N'utilisez PAS PHP et passez le cookie .htaccess.
la solution ci-dessus est trop occupé et foiré un peu.. J'ai opter pour la simplicité et la clarté comme ceci
<Files "protected.html">
AuthName "Username and password required"
AuthUserFile /home/fullpath/.htpasswd
Require valid-user
AuthType Basic
</Files>
ce qui précède doit être mis dans votre fichier htaccess où le "protégé.html" est le fichier que vous souhaitez protéger (il peut être tout ce que vous souhaitez, par exemple myphoto.jpg ou un document.zip, il suffit de le renommer à votre préférence). Le fichier AuthUserFile est le chemin complet vers votre fichier de mots de passe. Vous êtes fait.
bien que vous pourriez avoir à vous assurer les pré-requis pour ce sont fixés. AllowOverride et AuthConfig sont nécessaires dans les fichiers Apache directory tag configs pour que le code fonctionne, mais normalement il est prédéfini dans la boîte, donc vous devriez être en sécurité, sauf si vous faites votre propre compilation personnalisée.