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