Назад | Перейти на главную страницу

Приоритет конфигурации Apache

Если я установлю параметр конфигурации в httpd.conf который не используется снова в любом из наших vhosts, будет ли это действовать для каждого из vhosts или для каждого из них нужно будет установить параметры?

В частности, я хочу установить RewriteLog и RewriteLogLevel параметры. К сожалению, у нас гораздо больше конфигураций виртуальных хостов, чем это разумно, поэтому установка этой опции в каждом файле и проверка будут затруднительны во время его развертывания (не заставляйте меня начинать с управления конфигурациями). Итак, если я установлю его httpd.conf и убедитесь, что его нет ни в одной из конфигураций vhost, будет ли он применяться к каждому vhost?

Согласно документации Apache, разделы конфигурации объединяются в следующем порядке:

  1. <Directory> (кроме регулярных выражений) и .htaccess выполняются одновременно (с .htaccess, если разрешено, переопределение <Directory>)
  2. <DirectoryMatch><Directory "~">)
  3. <Files> и <FilesMatch> сделано одновременно
  4. <Location> и <LocationMatch> сделано одновременно
  5. <If>

Некоторые важные замечания:

  • Помимо <Directory>, внутри каждой группы разделы обрабатываются в том порядке, в котором они указаны в файлах конфигурации. Например, запрос / foo будет соответствовать <Location "/foo/bar"> и <Location "/foo"> (в данном случае группа 4): будут оцениваться оба раздела, но в том порядке, в котором они указаны в файлах конфигурации.
  • <Directory> (группа 1 выше) обрабатывается в порядке от самого короткого компонента каталога к самому длинному. Например, <Directory "/var/web/dir"> будет обработано до <Directory "/var/web/dir/subdir">.
  • Если несколько <Directory> разделы применяются к тому же каталогу, в котором они обрабатываются в порядке файла конфигурации.
  • Конфигурации, включенные с помощью директивы Include, будут обрабатываться так, как если бы они находились во включающем файле в месте расположения директивы Include.
  • Разделы внутри <VirtualHost> разделы применяются после соответствующих разделов вне определения виртуального хоста. Это позволяет виртуальным хостам переопределять конфигурацию основного сервера.
  • Когда запрос обслуживается mod_proxy, контейнер занимает место <Directory> контейнер в порядке обработки.

Например, следующее будет применяться в порядке A> B> C> D> E:

<Location "/">
    E
</Location>

<Files "f.html">
    D
</Files>

<VirtualHost *>
    <Directory "/a/b">
        B
    </Directory>
</VirtualHost>

<DirectoryMatch "^.*b$">
    C
</DirectoryMatch>

<Directory "/a/b">
    A
</Directory>

Более подробную информацию можно найти в документации: https://httpd.apache.org/docs/2.4/sections.html

Редактировать:

Директивы вроде <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>, и <VirtualHost> просто ограничьте объем включаемых в них директив, поэтому применяя <IfModule> директива к глобальной области файла применит его глобально.

Если вы пытаетесь переопределить mod_rewrite, вы можете рассмотреть возможность использования RewriteOptions директива установлена ​​на InheritDown. Это приведет к тому, что все дочерние конфигурации унаследуют настройки из родительской области, что эквивалентно помещению RewriteOptions Inherit в каждой дочерней области.

<IfModule mod_rewrite.c>
    RewriteOptions InheritDown
    RewriteLog [some setting here]
    RewriteLogLevel [somesettinghere]
</IfModule>

Размещение этого глобально применит ваши параметры ведения журнала к каждой дочерней области.