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

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

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

Восстановить Монику 2331977
источник
11
location /foo {
    deny all;
    return 404;
}

Это даст вам 403 все время из-за запрета на все ... Когда вы хотите, чтобы сервер давал вам 404, просто возвращайте только 404 ... вот так:

location /foo {
    return 404;
}
RemyNL
источник