Директива Apache Directory должна относиться к DocumentRoot или нет?

14

Должна ли Directoryдиректива Apache относиться к DocumentRoot или нет? Я спрашиваю в контексте VirtualHost, но это не должно иметь никакого значения.

Другими словами, это должно быть:

<VirtualHost>
    DocumentRoot /var/www
    <Directory /var/www>
    ...

или

<VirtualHost>
    DocumentRoot /var/www
    <Directory />
    ...

Оба работают. В Apache Справочник документы говорят:

Путь к каталогу - это либо полный путь к каталогу, либо строка с подстановочными знаками ...

... но затем они показывают два примера, противоречащих утверждению "полный путь".

ED: Существуют также противоречивые примеры на странице настройки производительности Apache в разделах FollowSymLinks и SymLinksIfOwnerMatch и AllowOverride .

Для интереса я посмотрел на стандартную настройку Debian для vhost и нашел это:

<VirtualHost *:80>
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    ...
Джефф
источник

Ответы:

9

Документация правильная, и в <Directory>директиве должен быть указан полный путь.

Ваш первый пример - как вы должны настроить директиву для VirtualHosts и применить параметры в директиве только к DocumentRoot. Ваш второй пример относится к корню файловой системы (буквально /).

Вы не опубликовали остальную часть директивы, но обычно она используется для попытки заключить Apache в тюрьму и ограничить его доступ, и обычно (но не всегда) помещается в основной файл apache2.confили httpd.confфайл конфигурации, при этом ваши VirtualHosts явно разрешают доступ к своим собственным DocumentRootкаталогам, поэтому они часто используются вместе.

Из документации Apache :

Обратите внимание, что доступ по умолчанию для <Directory /> разрешает весь доступ. Это означает, что Apache httpd будет обслуживать любой файл, сопоставленный с URL. Рекомендуется изменить это с помощью блока, такого как:
    <Directory />
      Требовать все отказано
    </ Directory>
и затем переопределите это для каталогов, которые вы хотите сделать доступными. Смотрите страницу Советы по безопасности для более подробной информации.
Крейг Уотсон
источник
Если второй пример буквально относится к файловой системе /, то почему Apache обслуживает /var/wwwкаталог?
Джефф
1
Apache будет обслуживать DocumentRoot. DirectoryДиректива полностью отдельно, и имеет эффект говоря «применить закрытую конфигурацию в этот каталог и все подкаталоги». Более конкретные конфигурации имеют приоритет, поэтому <Directory /var/www/>будут переопределены <Directory />.
Крейг Уотсон
Понимаю. Таким образом, <Directory />из контекста VirtualHost можно переопределить параметры сервера (или другие параметры) <Directory />? Это имеет смысл. Спасибо за помощь.
Джефф