Мне нужно ограничить доступ к любым файлам или подкаталогам в каталоге "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;
}