Чтобы убедиться, что вместо соответствия jpg / txt выбрано соответствие testdir, используйте следующие местоположения:
location ^~ /testdir {
deny all;
return 404;
}
location ~* ^.+\.(jpg|txt)$ {
root /var/www/site;
}
В вашем примере у вас есть два типа местоположений. location /testdir
является префиксным местоположением, так как не имеет тильды ( ~
) между location
и /testdir
.
location ~* ^.+\.(jpg|txt)$
является местоположением регулярного выражения (регистронезависимое, из-за *
непосредственно после тильды). Из документации nginx :
Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с использованием префиксных строк (префиксные местоположения). Среди них местоположение с самым длинным совпадающим префиксом выбирается и запоминается. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений заканчивается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, то используется конфигурация расположения префикса, запомненного ранее.
Проблема здесь в том, что ваше местоположение testdir запоминается, но затем местоположение jpg / txt выбирается на этапе регулярного выражения, как оно совпадает. Следующее примечание из документации - это то, на чем я основывал свое решение (приведенное выше):
Если самое длинное совпадающее местоположение префикса имеет модификатор «^ ~», то регулярные выражения не проверяются.