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.