как ограничить доступ к каталогу и подкаталогам


42

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

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

В моей конфигурации у меня нет ограничений на / testdir / jpg_or_txt-files. Как это сделать?


Обратите внимание, по моему опыту, функция местоположения работает правильно только при запуске nginx в Linux. При запуске на окнах у нас были проблемы с этим не работает ...
— Самсмит

Ответы:


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 выбрано соответствие 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 выбирается на этапе регулярного выражения, как оно совпадает. Следующее примечание из документации - это то, на чем я основывал свое решение (приведенное выше):

Если самое длинное совпадающее местоположение префикса имеет модификатор «^ ~», то регулярные выражения не проверяются.


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.