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


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.