Я настраиваю свой первый виртуальный сервер с нуля (имя провайдера опущено, но это «капля»). Я использую 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