J'ai besoin de restreindre 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?
pour restreindre l'accès à plusieurs répertoires dans nginx dans une entrée d'emplacement
...
location ~ /(dir1|dir2|dir3) {
deny all;
return 404;
}
...
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;
}
...
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'emplacements. location /testdir
Est un emplacement de préfixe, car il n'a pas de tilde (~
) Entre location
et /testdir
.
location ~* ^.+\.(jpg|txt)$
est un emplacement d'expression régulière (insensible à la casse, en raison du *
directement après le tilde). De la documentation nginx :
Pour trouver un emplacement correspondant à une demande donnée, nginx vérifie d'abord 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é. 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 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 du préfixe mémorisé précédemment est utilisée.
Le problème ici, c'est que votre emplacement testdir est mémorisé, mais ensuite l'emplacement jpg/txt est sélectionné pendant l'étape regex, car il correspond. La note suivante de la documentation est sur laquelle j'ai basé ma solution (donnée ci-dessus):
Si l'emplacement du préfixe correspondant le plus long possède le modificateur "^ ~", les expressions régulières ne sont pas vérifiées.
location /foo {
deny all;
return 404;
}
Cela vous donnera un 403 tout le temps à cause de tout refuser ... Lorsque vous voulez que le serveur vous donne un 404, ne retournez qu'un 404 ... comme ceci:
location /foo {
return 404;
}