Совпадение / запрет доступа ко всем подкаталогам с использованием конфигурации сервера apache2 - PullRequest
11 голосов
/ 10 марта 2011

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

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

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, и все запросы к любым подкаталогам не выполняются.

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

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

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

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

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

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

Ответы [ 6 ]

16 голосов
/ 21 марта 2011

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

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

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

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

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

3 голосов
/ 14 марта 2011

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

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


РЕДАКТИРОВАТЬ

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

<code><DirectoryMatch "^/var/www/(.+?)/(.+)/"> # again no $, see comment
Order Deny,Allow
Allow From All
</DirectoryMatch>
1 голос
/ 20 марта 2011

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

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


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

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

Хитрость в том, как объединить директивы .

0 голосов
/ 08 апреля 2014

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

httpd.conf:

...
Options FollowSymLinks
...

(опция «Индексы» не установлена).

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

Options Indexes

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

Options -Indexes

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

0 голосов
/ 14 марта 2011

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

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

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

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

0 голосов
/ 14 марта 2011

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

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

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

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

...