У меня есть один вопрос. Можно ли заблокировать доступ ко всем файлам в папке, если папка содержит определенный файл, например .block
. Я знаю, что могу рассчитывать на:
location ~ \.(mp3|log|txt|rtf|doc|docx)$ {
deny all;
return 404;
}
Если это возможно, то как это сделать?
Я пробовал с:
location ~ \.block {
deny all;
return 404;
}
Но эта функция ограничивает только файлы .block, а не файлы внутри папки (все еще доступны для загрузки или простого открытия в браузере)
Привет.
решение1
Боюсь, то, чего вы пытаетесь добиться, не присутствует в NginX по умолчанию. Вы могли бы использовать оператор IF, но вы знаете.... IFISEVIL
Поскольку вы добавляете эти файлы вручную, вы можете просто сделать следующее:
location ~ /(folder1|folder2|folder3|...) {
deny all;
}
Таким образом, вам не придется создавать новое местоположение каждый раз, когда вы хотите заблокировать папку. Просто добавьте папку в список в этом, и вы готовы к работе.
решение2
Когда имена каталогов неизвестны или постоянно меняются, можно использовать ответ @Bert для генерации отдельной конфигурации с собранными именами через bash-скрипт и выполнить ее с помощью cron.
1. Скрипт для поиска каталогов и сбора их в конфиге nginx.
#! /bin/bash
# Search directories with file '.block' and collect them in a variable.
# Format dir1|dir2|dir3
DIR_NAMES=$(find ~/temp -type f -name '.block' -printf '|%h')
# remove first "|"
DIR_NAMES=${DIR_NAMES#?}
# generate new config with names
echo "location ~ /($DIR_NAMES) {
deny all;
}" > nginx-block-directories.conf
# reload nginx with a new config
sudo nginx reload
2. Включите сгенерированную конфигурацию в основную конфигурацию nginx, например в раздел «server»:
include nginx-block-directories.conf;
3. Обновляйте конфигурацию nginx каждую ночь (crontab -e):
30 3 * * * /path/script.sh