Совпадение/Запрет доступа ко всем подкаталогам с использованием конфигурации сервера apache2

Как можно запретить доступ ко всем подкаталогам данного каталога? (Позволяя вручную изменять права доступа для отдельных элементов в дереве каталогов.)

Я попытался сделать это с помощью директив <Directory(Match)>. Конфигурация сервера (с поддержкой тысяч сайтов) выглядит следующим образом:

DocumentRoot /var/www
<Directory /var/www>
    Allow from all
    Deny from none
    Order deny,allow
</Directory>
<Directory /var/www/*>
    Deny from all
</Directory>

Запрос http://localhost/ успешно отображает /var/www/index.html, и все запросы к каким-либо подкаталогам терпят неудачу.

Проблема заключается в том, что любой запрос к файлу в httproot сбой - то есть запрос http://localhost/index.html приведет к 403 Forbidden.

Директивы <Directory(Match)>, по-видимому, соответствуют каталогам и файлам!?

Чтобы убедиться, что это правда, я попытался:

<Directory /var/www/i*>
    Deny from all
</Directory>

Это запрещает доступ только к файлам/каталогам, начиная с "i".

Есть ли способ изменить это поведение и позволить <Directory> сопоставлять только каталоги? Есть ли другой способ добиться того, что все подкаталоги запрещены? (кроме того, что все они вручную запрещены или разрешены все файлы вручную)

Ответ 1

в конце концов, решение оказывается довольно простым:

<Directory /var/www/*/>
    Allow from None
    Order allow,deny
</Directory>

Обратите внимание на завершающую косую черту / после шаблона каталога, которая заставит его соответствовать только каталогам, а не файлам!

Это работает точно так же, как мы ожидаем от <Directory> -directive, поскольку он запрещает доступ только к прямым подкаталогам /var/www/. Указанные подкаталоги (в любом месте дерева) могут быть снова включены вручную с помощью директив <Directory>.

Это отличается от <DirectoryMatch>, которое будет  - также соответствуют всем файлам и каталогам в дереве и
 - переопределить все директивы <Files> или <Directory> для любого элемента в дереве.

Ответ 2

Это сделало это для меня.

<DirectoryMatch "^/var/www/(.+)/"> # don't put $ at the end
Order Allow,Deny
Deny From All
</DirectoryMatch>


ИЗМЕНИТЬ

Чтобы не отрицать суб-подкаталоги (комментарий ниже), добавьте этот каталог, расположенный ниже того, который указан в файле конфигурации:

<DirectoryMatch "^/var/www/(.+?)/(.+)/"> # again no $, see comment
Order Deny,Allow
Allow From All
</DirectoryMatch>

Ответ 3

Используйте это:

<Directory /var/www/public>
    allow from all
</Directory>


<DirectoryMatch "^/var/www/public/(.+)/">
   deny from all
</DirectoryMatch>

Возможно, вы захотите добавить опции и т.д.

Трюк как объединяются директивы.

Ответ 4

Итак, у меня есть 2 мысли, которые могут помочь (или нет).

Во-первых, местоположения могут переопределять разрешения вашего каталога. Поэтому убедитесь, что у вас их нет. поражая localhost/, попадает в то, что вы настроили как root, что, вероятно, отменяет вашу безопасность. Поэтому, если вы укажете файл напрямую, вы не можете его получить. Итак, если вы не хотите, чтобы люди могли достичь вашего корня, вы не должны указывать корень.

Что касается ограничения доступа к подкаталогам, я бы просмотрел этот другой пост.... может быть, не полезно. Возможно, более подробная информация в вашем случае использования поможет.

https://serverfault.com/questions/190447/apache-2-htaccess-matching-all-sub-directories-of-current-directory

Ответ 5

Лучший подход - переместить весь контент, недоступный для публики каталогу из корневого дерева, например /home/my/app/

<Directory /home/my/app>
    Order Allow,Deny
    Deny from all
</Directory>

Затем дайте разрешение на чтение пользователю Apache в этом каталоге и во всех каталогах, которые приводят к этому, например, /home и/my

Таким образом, существует риск того, что часть этого содержимого протекает при возникновении ошибки конфигурации корневого каталога.

Ответ 6

Вы можете отключить автоматическую индексацию во всех подкаталогах, удалив параметр Indexes из директивы Options внутри файла конфигурации, поэтому для конфигурации по умолчанию директива Options должна выглядеть примерно так:

httpd.conf:

...
Options FollowSymLinks
...

(нет опции "Индексы".)

Затем добавьте index.html или index.php файл внутри каждого конкретного подкаталога, который вы хотите использовать для доступа клиента. Если вы хотите, чтобы автоматическая индексация включалась в определенном каталоге, вы можете добавить файлы .htaccess внутри этих каталогов и поместить эту строку в файл .htaccess:

Options Indexes

Обратите внимание, что .htaccess будет рекурсивно влиять на его каталог и все его подкаталоги, поэтому вы должны исключить любую рекурсивную подкаталоги, в которой вы не хотите использовать эту опцию, добавив .htaccess и отключение автоматического индекса:

Options -Indexes

Примечание. Чтобы файлы .htaccess включались и влияли на конфигурацию apache, вы должны AllowOveride All в каталоге совпадать, чтобы разместить файл .htaccess.