Je dois exclure une URL (ou même un préfixe mieux) de la protection htaccess Basic Auth normale. Quelque chose comme /callbacks/myBank
ou /callbacks/.*
Avez-vous des conseils pour le faire?
Ce que je ne cherche pas, c'est comment exclure un fichier. Ce doit être une URL (car il s’agit d’une solution basée sur le framework PHP), et toutes les URL sont redirigées avec mod_rewrite
à index.php
). Donc, il n'y a pas de fichier sous cette URL. Rien.
Certaines de ces URL ne sont que des rappels provenant d'autres services (aucune adresse IP n'est connue, je ne peux donc pas exclure en fonction de l'adresse IP) et ils ne peuvent pas demander d'utilisateur/mot de passe.
La définition actuelle est aussi simple que:
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user
Si vous utilisez Apache 2.4, les solutions de contournement SetEnvIf
et mod_rewrite ne sont plus nécessaires, car la directive Require
permet d'interpréter directement les expressions:
AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"
Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user
Apache 2.4 traite les directives Require
qui sont pas regroupées par <RequireAll>
comme s'ils étaient dans un <RequireAny>
, qui se comporte comme une déclaration "ou". Voici un exemple plus compliqué qui illustre la mise en correspondance de l'URI de la demande et de la chaîne de requête, ainsi que le recours à un utilisateur valide:
AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"
<RequireAny>
<RequireAll>
# I'm using the alternate matching form here so I don't have
# to escape the /'s in the URL.
Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
# You can also match on the query string, which is more
# convenient than SetEnvIf.
#Require expr %{QUERY_STRING} = 'secret_var=42'
</RequireAll>
Require valid-user
</RequireAny>
Cet exemple permettrait d’accéder à /callbacks/foo?secret_var=42
mais nécessite un nom d’utilisateur et un mot de passe pour /callbacks/foo
.
Rappelez-vous que si vous utilisez <RequireAll>
, Apache essaiera de faire correspondre chaque Require
dans l’ordre . Réfléchissez donc aux conditions que vous souhaitez autoriser en premier.
La référence de la directive Require
est la suivante: https://httpd.Apache.org/docs/2.4/mod/mod_authz_core.html#require
Et la référence expr
ession est ici: https://httpd.Apache.org/docs/2.4/expr.html
En utilisant SetEnvIf , vous pouvez créer une variable lorsque la demande commence par un chemin, puis utilisez la méthode Satisfy Any
directive pour éviter d'avoir à se connecter.
# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1
# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth
Le bloc de directives autoriser/refuser indique que refuser l'accès pour [~ # ~] à tout le monde [~ # ~] , sauf en cas de valid-user (connexion authentifiée BASIC réussie) ou si la variable noauth
est définie.
Cette solution fonctionne plutôt bien, il vous suffit de définir la liste blanche que vous souhaitez consulter.
SetEnvIfNoCase Request_URI "^/status\.php" noauth
AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user
Order Deny,Allow
Deny from all
Allow from env=noauth
Satisfy any
J'ai essayé les autres solutions mais c'est ce qui a fonctionné pour moi. Espérons que cela aidera les autres.
# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file
SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any
Cela permettra à l’API d’URL et à toute chaîne d’URL après /index.php/api/
pour ouvrir sans avoir à se connecter et tout le reste sera invité à se connecter.
Exemple:
mywebsite.com/index.php/api
s'ouvrira sans être invité à se connecter mywebsite.com/index.php/api/soap/?wsdl=1
s'ouvrira sans être invité à se connecter mywebsite.com
sera invité à se connecter d'abord
<location />
SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/httpd/passwords/passwords
Order Deny,Allow
Satisfy any
Deny from all
Allow from env=REDIRECT_noauth
Require user yournickname
</location>
Une autre approche fonctionne comme ceci, si la zone que vous protégez a un script monolithique PHP contrôlant tout, comme Wordpress. Configurez l’authentification avec dans un répertoire différent. Placez-y un index.php qui définit cookie sur le chemin '/'. Ensuite, dans Wordpress (par exemple), vérifiez le cookie, mais ignorez si $ _SERVER ['REQUEST_URI'] est l'URL exclue.
Sur ma plate-forme d'hébergement partagé, RewriteRule n'a pas pu définir de variable d'environnement compatible avec "Satisfaire à tout".
Quelle que soit l'approche choisie, veillez à ce que la page que vous protégez n'inclue pas d'images, de feuilles de style, etc., qui déclenchent une demande d'authentification alors que la page elle-même n'en contient pas.
pourquoi n'utilisez-vous pas simplement l'authentification de base telle qu'elle était prévue?
user:[email protected]/callbacks/etc
Ajoutez le code ci-dessous à votre fichier htaccess racine et n'oubliez pas de changer votre page d'administrateur, page de fichier .htpasswd.
<Files "admin.php">
AuthName "Cron auth"
AuthUserFile E:\wamp\www\mg\.htpasswd
AuthType basic
Require valid-user
</Files>
Créez un fichier .htpasswd dans votre dossier racine et ajoutez ci-dessous le nom d'utilisateur et le mot de passe (définissez le nom d'utilisateur par défaut: admin et le mot de passe: admin123)
admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.
S'il vous plaît laissez-moi savoir si vous êtes toujours confronté à un problème.