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

Порядок директив Apache: глобальные блоки, блоки Pre-VHost или каталоги

Я настраиваю свой первый виртуальный сервер с нуля (имя провайдера опущено, но это «капля»). Я использую WHM некоторое время и чувствую, что хорошо с ним знаком.

В частности, это машина Debian 8, на которой запущен Apache 2.4 (он использует apache.conf не httpd.conf)

В любом случае, мне сложно понять, где разместить то, что я считаю глобальными директивами (они должны применяться к каждому сайту), доступными в каждом контексте.

Тривиальные примеры - установка кодировки по умолчанию или включение mod_deflate для активации gzip.

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

Вот что у меня есть:

<IfModule mod_rewrite.c>
  RewriteEngine on
  Options FollowSymlinks
  RewriteCond %{HTTP_REFERER} (badreferer1\..*) [NC,OR]
  RewriteCond %{HTTP_REFERER} (crappy-referer2\..*) [NC,OR]
  RewriteCond %{HTTP_REFERER} (webiste-i-hate3\..*) [NC]
  RewriteRule ^(.*)$ http://%1 [R=301,L]
</IfModule>

Я почти уверен, что мой RegEx верен (я хочу перенаправить все протоколы, все поддомены и все TLD, содержащие эти строки).

Насколько я понимаю, эти правила будут работать, если они будут добавлены в каждый блок директив vhost, но это кажется ужасно избыточным.

Я бы хорошо применил эти правила глобально, но добавил бы их в начало списка моих apache.conf не работает

Мне нужно их завернуть в <Directory> блок?

Могу я положить их <Directory />?

Все мои сайты в /var/www/html, нужно ли мне применять эти правила в <Directory /var/www/html>?

Что мне не хватает (не с точки зрения кода, поскольку этот фрагмент неполный, а с точки зрения директив упорядочивания и знания, где их разместить)?

Я бы хотел оставить себе .conf файл как можно более кратким и избегайте использования .htaccess (и нет AllowOverrides по соображениям производительности), поэтому я пытаюсь понять, как заставить это работать в apache.conf (размещение их в файле, который вызывается через include, допустимо, так как их уже несколько).

Что касается правил перезаписи, они разрешены в конфигурации основного сервера, но не влияют на VirtualHosts. Немного скрыто в инструкции упоминается несколько случайно:

Обратите внимание, что конфигурации перезаписи не унаследован виртуальными хостами. Это означает, что вам нужно иметь RewriteEngine on директива для каждого виртуального хоста в котором вы хотите использовать правила перезаписи.

Таким образом, универсальный набор правил во включаемом файле как часть каждого VirtualHost кажется оптимальным вариантом.

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

  • конфигурация сервера
    Это означает, что директива может использоваться в файлах конфигурации сервера (например, httpd.conf), но не в каких-либо <VirtualHost> или <Directory> контейнеры. Это вообще не разрешено в файлах .htaccess.

  • виртуальный хост
    Этот контекст означает, что директива может находиться внутри <VirtualHost> контейнеры в файлах конфигурации сервера.

  • каталог
    Директива, отмеченная как действительная в этом контексте, может использоваться внутри <Directory>, <Location>, <Files>, <If>, и <Proxy> контейнеры в файлах конфигурации сервера с учетом ограничений, указанных в разделах конфигурации.

  • .htaccess
    Если директива действительна в этом контексте, это означает, что она может появляться внутри файлов .htaccess для каждого каталога. Это может не быть обработано, хотя в зависимости от текущих активных переопределений.

Директивы в основной конфигурации сервера применяются ко всему серверу,
директивы в <VirtualHost> применяется только к этому виртуальному хосту
и есть целая глава о том, как все разделы связаны вместе: https://httpd.apache.org/docs/2.4/en/sections.html