Как заблокировать доступ к папкам при отсутствии определенного файла - NGINX

Как заблокировать доступ к папкам при отсутствии определенного файла - NGINX

У меня есть один вопрос. Можно ли заблокировать доступ ко всем файлам в папке, если папка содержит определенный файл, например .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

Связанный контент