Подтвердить что ты не робот

Как я могу реализовать глобальный RewriteCond/RewriteRule в Apache, который применяется ко всем виртуальным хостам?

Название довольно много говорит обо всем.:-) У меня много виртуальных хостов, и я хочу разместить один блок перезаписи в верхней части файла httpd.conf, который переписывает URL-адреса независимо от того, к какому виртуальному хосту может быть направлен запрос. Как я это делаю?

Я нашел этот, но мой вопрос тот же: как я могу это сделать, не прибегая к файлам .htaccess и выполняя некоторые другие действия для каждого виртуальный хост?

OMGTIA!

4b9b3361

Ответ 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.... оба более логичны.