Назад | Перейти на главную страницу

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

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

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

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

для ограничения доступа к нескольким каталогам в nginx в одной записи местоположения выполните

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

Это потому, что директива «root» совпадает до того, как может быть сопоставлена ​​директива «deny». Измените порядок ваших директив, и он должен работать:

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

Чтобы убедиться, что соответствие testdir выбрано вместо соответствия jpg / txt, используйте следующие местоположения:

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

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

location /foo {
    deny all;
    return 404;
}

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

location /foo {
    return 404;
}