Как я могу реализовать глобальный RewriteCond/RewriteRule в Apache, который применяется ко всем виртуальным хостам?
Название довольно много говорит обо всем.:-) У меня много виртуальных хостов, и я хочу разместить один блок перезаписи в верхней части файла httpd.conf, который переписывает URL-адреса независимо от того, к какому виртуальному хосту может быть направлен запрос. Как я это делаю?
Я нашел этот, но мой вопрос тот же: как я могу это сделать, не прибегая к файлам .htaccess и выполняя некоторые другие действия для каждого виртуальный хост?
OMGTIA!
Ответы
Ответ 1
Укажите RewriteOptions InheritDown
в родительской области (например, httpd.conf), чтобы ваши правила применялись в дочерних виртуальных хостах без их модификации.
Это будет работать только на виртуальных хостах, где директива RewriteEngine
установлена на on
:
Обратите внимание, что переписывающие конфигурации не наследуются виртуальными хостами. Это означает, что вам нужно иметь RewriteEngine для директивы для каждого виртуального хоста, в котором вы хотите использовать правила перезаписи.
(источник)
Apache поддерживает это с 2.4.8 (недоступно во время исходного вопроса).
Из документации для RewriteOptions
:
InheritDown
Если эта опция включена, все дочерние конфигурации наследуют конфигурацию текущей конфигурации. Это эквивалентно определению RewriteOptions Inherit во всех дочерних конфигурациях. См. Опцию Inherit для получения более подробной информации о том, как обрабатываются отношения родитель-потомок. Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.
InheritDownBefore
Как и InheritDown выше, но правила из текущей области применения применяются до правил, заданных в любой дочерней области. Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.
IgnoreInherit
Этот параметр заставляет текущую и дочернюю конфигурации игнорировать все правила, которые будут унаследованы от родителя с указанием InheritDown или InheritDownBefore. Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.
(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions)
Ответ 2
По умолчанию параметры конфигурации mod_rewrite из основного контекста сервера не наследуются виртуальными хостами. Чтобы настройки основного сервера применялись к виртуальным хостам, вы должны поместить следующие директивы в каждый раздел <VirtualHost>
:
RewriteEngine On
RewriteOptions Inherit
нажмите http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html, чтобы найти дополнительную информацию
Ответ 3
Похоже, самое простое решение - добавить
RewriteOptions inherit
для каждой директивы VirtualHost. Это по крайней мере намного проще, чем возиться с файлами .htaccess. Apache довольно ясно говорит о том, что
по умолчанию, переписать конфигурации не наследуется. Это означает, что вы нужно иметь RewriteEngine на директива для каждого виртуального хоста в который вы хотите использовать. (http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html)
и, по-видимому, способ изменить значение по умолчанию - через RewriteOptions в дочернем элементе (vhost или Director), поэтому вам нужно что-то делать в каждом из них.
Ответ 4
Я никогда не тестировал его, так что это может не сработать, но я бы попробовал добавить директиву include
во всех виртуальных блоках хоста в один файл. Вам нужно будет изменить каждый блок конфигурации виртуального хоста один раз, но после этого у вас должно быть центральное место для внесения изменений. YMMV.
Ответ 5
Если вы только пытаетесь переписать что-то в доменной части имени, например. чтобы исправить общую орфографическую ошибку, вам даже не нужна опция "inherit". Я настраиваю виртуальный хост без имени, чтобы уловить все недопустимые имена хостов и правильно их перенести, прежде чем перенаправлять их.
Так как это использует перенаправления, соответствующий виртуальный хост будет найден после того, как будут применены перезаписи.
Options +Indexes +FollowSymLinks
RewriteEngine on
# If it begins with only domain.com, prepend www and send to www.domain.com
RewriteCond %{HTTP_HOST} ^domain [NC]
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301]
# Correct misspelling in the domain name, applies to any VirtualHost in the domain
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301]
# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them
<VirtualHost *>
RewriteEngine on
RewriteOptions inherit
</VirtualHost>
Ответ 6
Я всегда использовал "уловку" VHost для директив, которые я хотел по всем направлениям, например......
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ErrorLog "/var/log/apache2/error_log"
</VirtualHost>
<VirtualHost *:80>
ServerName alloftherestoftheVHosts.com
DocumentRoot "/ServiceData/.........
............
И всегда казалось, что работа... журналы ошибок собирались правильно и т.д., но возможно, что это было результатом более ранней/противоречивой/единомышленной директивы.
Личные заметки. Тот, кто придумал схему и синтаксис конфигурации Apache, был дингбатом или группой дингбатов, которые потратили слишком много времени в своей пещере... Все это должно быть изгнано и XMLized или что-то в этом роде! Хотя они оба совершенно разные... процесс установки Hello-Kitty Cherokee.. к злобно сжатому NGinx config.... оба более логичны.