Para asegurarse de que se elige la coincidencia testdir en lugar de la coincidencia jpg / txt, use las siguientes ubicaciones:
location ^~ /testdir {
deny all;
return 404;
}
location ~* ^.+\.(jpg|txt)$ {
root /var/www/site;
}
En su ejemplo, tiene dos tipos de ubicaciones. location /testdir
es una ubicación de prefijo, ya que no tiene tilde ( ~
) entre location
y /testdir
.
location ~* ^.+\.(jpg|txt)$
es una ubicación de expresiones regulares (no distingue entre mayúsculas y minúsculas, debido a que está *
directamente detrás de la tilde). De la documentación de nginx :
Para encontrar una ubicación que coincida con una solicitud determinada, nginx primero verifica las ubicaciones definidas utilizando las cadenas de prefijo (ubicaciones de prefijo). Entre ellos, se selecciona y recuerda la ubicación con el prefijo coincidente más largo. Luego se verifican las expresiones regulares, en el orden de su aparición en el archivo de configuración. La búsqueda de expresiones regulares termina en la primera coincidencia y se utiliza la configuración correspondiente. Si no se encuentra una coincidencia con una expresión regular, se utiliza la configuración de la ubicación del prefijo recordada anteriormente.
El problema aquí es que su ubicación testdir se está recordando, pero luego la ubicación jpg / txt se selecciona durante la etapa de expresión regular, ya que coincide. La siguiente nota de la documentación es en lo que basé mi solución (dada anteriormente):
Si la ubicación de prefijo coincidente más larga tiene el modificador "^ ~", entonces no se verifican las expresiones regulares.