comment restreindre l'accès aux répertoires et aux sous-répertoires

42

Je dois limiter l'accès à tous les fichiers ou sous-répertoires 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_or_txt-files. Comment faire?


la source
Notez que, selon mon expérience, la fonction de localisation ne fonctionne correctement que si vous exécutez nginx sur linux. Lorsque nous avons exécuté Windows, nous avons eu du mal à ne pas fonctionner ...
samsmith

Réponses:

43

restreindre l’accès à plusieurs répertoires de nginx dans un seul emplacement

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...
DavidR.
la source
7
Vous devriez retourner 403 et non 404.
Stillmatic1985
12
Cela ne répond pas du tout à la question.
1
en retournant 403 donne un indice que le dossier existe, un 404 ne donne aucune preuve de son existence
Don Wilson
23

C'est parce que la directive "root" correspond avant que la directive "deny" puisse être mise en correspondance. Inversez l'ordre de vos directives et cela devrait fonctionner:

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

Pour vous assurer que la correspondance testdir est choisie à la place 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 d’emplacement. location /testdirest un préfixe, car il n'a pas de tilde ( ~) entre locationet /testdir.

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

Pour trouver un emplacement correspondant à une requête donnée, nginx commence par vérifier les emplacements définis à l'aide des chaînes de préfixe (emplacements de préfixe). Parmi eux, l'emplacement avec le préfixe correspondant le plus long est sélectionné et mémorisé. Ensuite, les expressions régulières sont vérifiées, dans l'ordre d'apparition dans le fichier de configuration. La recherche d'expressions régulières se termine à 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 de préfixe précédemment mémorisé est utilisée.

Le problème ici est que votre emplacement testdir est mémorisé, mais l'emplacement jpg / txt est sélectionné pendant l'étape de la regex, car il correspond. La note suivante de la documentation est la base de ma solution (donnée ci-dessus):

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

Rétablir Monica 2331977
la source
11
location /foo {
    deny all;
    return 404;
}

Cela vous donnera tout le temps un 403 à cause du refus de tout ... Quand vous voulez que le serveur vous donne un 404, il vous suffit de renvoyer un 404 ... comme ceci:

location /foo {
    return 404;
}
RemyNL
la source