57 votes

comment restreindre l'accès à un répertoire et à ses sous-dossiers

J'ai besoin de restreindre l'accès à tous les fichiers ou sous-dossiers du répertoire "testdir". Ma conf :

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

Dans ma configuration, je n'ai aucune restriction sur /testdir/jpg_ou_txt-files. Comment faire ?

62voto

BarclayVision Points 115

Pour restreindre l'accès à plusieurs répertoires dans nginx en une seule entrée, faire

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

25voto

Guillaume Filion Points 947

C'est parce que la directive "root" s'applique avant que la directive "deny" puisse s'appliquer. Inversez l'ordre de vos directives et cela devrait fonctionner :

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

22voto

user192347 Points 1

Pour s'assurer que la correspondance testdir est choisie au lieu de la correspondance jpg/txt, utilisez les emplacements suivants :

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

Dans votre exemple, vous avez deux types de lieux. location /testdir est un préfixe, car il ne comporte pas de tilde ( ~ ) entre location y /testdir .

location ~* ^.+\.(jpg|txt)$ est un emplacement de regex (insensible à la casse, en raison de l'option * directement après le tilde). À partir du documentation nginx :

Pour trouver l'emplacement correspondant à une requête donnée, nginx vérifie d'abord les emplacements définis à l'aide des chaînes de préfixes (prefix locations). Parmi eux, l'emplacement avec le préfixe correspondant le plus long est sélectionné et mémorisé. Les expressions régulières sont ensuite vérifiées, dans l'ordre de leur apparition dans le fichier de configuration. La recherche d'expressions régulières s'arrête à la première correspondance, et la configuration correspondante est utilisée. Si aucune correspondance avec une expression régulière n'est trouvée, la configuration de l'emplacement du préfixe mémorisé précédemment est utilisée.

Le problème ici, c'est que l'emplacement de votre répertoire de test est mémorisé, mais que l'emplacement jpg/txt est sélectionné lors de l'étape de l'expression rationnelle, car il correspond. La note suivante de la documentation est ce sur quoi j'ai basé ma solution (donnée ci-dessus) :

Si l'emplacement du préfixe correspondant le plus long a le modificateur "^~", les expressions régulières ne sont pas vérifiées.

15voto

RemyNL Points 250
location /foo {
    deny all;
    return 404;
}

Cela vous donnera un 403 tout le temps à cause du deny all... Lorsque vous voulez que le serveur vous renvoie un 404, ne renvoyez qu'un 404... comme ceci :

location /foo {
    return 404;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X