web-dev-qa-db-fra.com

Exclure un dossier du répertoire protégé par htaccess

J'ai un répertoire protégé par htaccess. Voici le code que j'utilise maintenant:

AuthName "Test Area"
Require valid-user
AuthUserFile "/***/.htpasswd"
AuthType basic

Cela fonctionne bien. Cependant, j'ai maintenant un répertoire à l'intérieur de ce dossier auquel j'aimerais permettre à quiconque d'accéder, mais je ne sais pas comment le faire.

Je sais qu'il est possible de simplement déplacer les fichiers en dehors du répertoire protégé, mais pour faire court, le dossier doit rester à l'intérieur du dossier protégé, mais être accessible à tous.

Comment puis-je restreindre l'accès au dossier, mais autoriser l'accès au sous-dossier?

24
Sherwin Flight

Selon cet article vous pouvez accomplir cela en utilisant SetEnvIf. Vous faites correspondre chacun des dossiers et fichiers auxquels vous souhaitez accéder et définissez une variable d'environnement "autoriser" pour eux. Ensuite, vous ajoutez une condition qui autorise l'accès si cette variable d'environnement est présente.

Vous devez ajouter les directives suivantes à votre .htaccess.

SetEnvIf Request_URI "(path/to/directory/)$" allow
SetEnvIf Request_URI "(path/to/file\.php)$"  allow
Order allow,deny
Allow from env=allow
Satisfy any
16
Sudhir Bastakoti

Créez simplement un fichier .htaccess dans le sous-répertoire avec le contenu:

Satisfy any

42
user3201334

La réponse acceptée ne semble pas bien fonctionner avec les nouvelles versions d'Apache, car elle a cessé de fonctionner dès que les mises à jour Apache ont été déployées sur certains des serveurs de mes clients.

Je recommande l'approche suivante:

AuthType Basic
AuthName "NO PUBLIC ACCESS"
AuthUserFile /xxx/.htpasswd

SetEnvIf REQUEST_URI "(path/to/directory/)$" ALLOW

<RequireAny>
  Require env ALLOW
  Require valid-user
</RequireAny>
7
sebastian

Je n'ai pas assez de réputation pour ajouter un commentaire, mais deux de ces réponses utilisent le modèle:

SetEnvIf Request_URI "(path/to/directory/)$" allow

pour définir une variable d'environnement, puis vérifiez si elle existe. La partie entre guillemets est une expression régulière. Cette déclaration indique que tout chemin qui se termine par "chemin/vers/répertoire /" correspond et doit définir la variable, comme "chemin d'administration/vers/répertoire /", mais pas "chemin/vers/répertoire/index.html". Le "$" correspond à la fin de la chaîne.

Une meilleure correspondance serait:

SetEnvIf Request_URI "^/path/to/directory/" allow

Cela signifie que le chemin URI doit commencer par "/ chemin/vers/répertoire /" (le curseur correspond au début de la chaîne) mais peut avoir du contenu supplémentaire après la barre oblique de fin. Notez que cela nécessite la barre oblique de fin. Pour le rendre facultatif, vous pouvez ajouter deux règles:

SetEnvIf Request_URI "^/path/to/directory$" allow
SetEnvIf Request_URI "^/path/to/directory/" allow

ou, avec plus de correspondance de motifs:

SetEnvIf Request_URI "^/path/to/directory(/.*)?$" allow

La parenthèse et le point d'interrogation forment un groupe facultatif et ". *" Signifie zéro ou plusieurs caractères.

Personnellement, j'utiliserais require all granted1 dans le .htaccess du sous-dossier ou:

require expr "%{REQUEST_URI} =~ m|^/path/to/directory(/.*)?$|"2 dans le parent.

1
melds