як обмежити доступ до каталогу та підкаталогів


42

Мені потрібно обмежити доступ до будь-яких файлів чи підкаталогів в директиві "testdir". Мій конф:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

У моїй конфігурації у мене немає обмежень на / testdir / jpg_or_txt-файли. Як це зробити?


Зауважте, на мій досвід, функція розташування працює належним чином лише під час запуску nginx в Linux. Під час роботи на windows у нас виникли проблеми, коли це не
спрацювало

Відповіді:


43

щоб обмежити доступ до декількох каталогів у nginx в одній записи місця

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

7
Ви повинні повернути 403, а не 404.
Stillmatic1985

12
Це зовсім не відповідає на питання.

1
повернення 403 дає натяк на те, що папка існує, 404 не дає жодних доказів існування папки
Дон Вілсон

23

Це тому, що директива "root" збігається перед тим, як директива "deny" може бути узгоджена. Зворотний порядок дії ваших директив, і він повинен працювати:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

16

Щоб переконатися, що замість тестування обрано замість 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 розташування вибирається під час етапу регулярного вираження, як воно відповідає. Наступна примітка з документації - це те, на чому я базував своє рішення (дане вище):

Якщо місце найдовшого відповідного префікса має модифікатор «^ ~», регулярні вирази не перевіряються.


11
location /foo {
    deny all;
    return 404;
}

Це дасть вам 403 весь час через заперечення всіх ... Коли ви хочете, щоб сервер дав вам 404, просто поверніть 404 ... так:

location /foo {
    return 404;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.