Para garantir que a correspondência testdir seja escolhida em vez da correspondência jpg / txt, use os seguintes locais:
location ^~ /testdir {
deny all;
return 404;
}
location ~* ^.+\.(jpg|txt)$ {
root /var/www/site;
}
No seu exemplo, você tem dois tipos de locais. location /testdir
é um local de prefixo, pois não possui til ( ~
) entre location
e /testdir
.
location ~* ^.+\.(jpg|txt)$
é um local de regex (que não diferencia maiúsculas de minúsculas, devido ao *
diretamente após o til). Na documentação do nginx :
Para encontrar um local que corresponda a uma determinada solicitação, o nginx primeiro verifica os locais definidos usando as sequências de prefixos (localizações do prefixo). Entre eles, o local com o prefixo correspondente mais longo é selecionado e lembrado. Em seguida, as expressões regulares são verificadas, na ordem em que aparecem no arquivo de configuração. A pesquisa de expressões regulares termina na primeira correspondência e a configuração correspondente é usada. Se nenhuma correspondência com uma expressão regular for encontrada, a configuração do local do prefixo lembrado anteriormente será usada.
O problema aqui é que seu local testdir está sendo lembrado, mas o local jpg / txt é selecionado durante o estágio regex, conforme corresponder. A seguinte nota da documentação é sobre a qual baseei minha solução (fornecida acima):
Se o local do prefixo correspondente mais longo tiver o modificador “^ ~”, as expressões regulares não serão verificadas.