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

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

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

OMGTIA!

Ответы [ 7 ]

12 голосов
/ 29 июня 2015

Укажите RewriteOptions InheritDown в родительской области (например, httpd.conf), чтобы ваши правила применялись в дочерних виртуальных хостах без их изменения.

Это будет работать только на виртуальных хостах, где директива RewriteEngine установлена ​​на on:

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

( источник )

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)

11 голосов
/ 12 декабря 2011

По умолчанию параметры конфигурации mod_rewrite из контекста основного сервера не наследуются виртуальными хостами. Чтобы настройки основного сервера применялись к виртуальным хостам, вы должны поместить следующие директивы в каждый раздел <VirtualHost>:

RewriteEngine On
RewriteOptions Inherit 

нажмите http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html, чтобы найти больше информации

9 голосов
/ 20 ноября 2009

Похоже, самое простое решение - добавить

RewriteOptions inherit

каждой директиве VirtualHost. Это, по крайней мере, намного проще, чем возиться с файлами .htaccess. Apache довольно ясно говорит о том, что

по умолчанию, конфигурации перезаписи не наследуется. Это означает, что вы нужно иметь RewriteEngine на директива для каждого виртуального хоста в который вы хотите использовать. (http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html)

и, очевидно, способ изменить значение по умолчанию - через RewriteOptions в дочернем элементе (vhost или Director), поэтому вы должны сделать что-то в каждом дочернем элементе.

5 голосов
/ 18 декабря 2008

Я никогда не проверял его, поэтому он может не работать, но я бы попытался добавить директиву include во всех блоках виртуального хоста в один файл. Вы должны будете изменить каждый блок конфигурации виртуального хоста один раз, но после этого у вас должно быть центральное место для внесения изменений. YMMV.

2 голосов
/ 09 июля 2010

Если вы пытаетесь переписать что-то в доменной части имени, например, чтобы исправить обычную орфографическую ошибку, вам даже не нужна опция «наследовать». Я настроил виртуальный хост без имени, чтобы перехватить все недопустимые имена хостов и правильно их перекомпилировать перед перенаправлением.

Поскольку при этом используются перенаправления, соответствующий виртуальный хост будет найден после применения перезаписей.

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>
0 голосов
/ 02 июня 2018

Возможно, вы захотите использовать InheritDownBefore, чтобы избежать необходимости добавлять больше мусора в ваши vhosts.

Пример глобального псевдонима letsencrypt:

# letsencrypt
<IfModule alias_module>
    Alias /.well-known/ /var/www/html/.well-known/
</IfModule>
<IfModule mod_rewrite.c>
    # prevent vhost rewrites from killing the alias
    RewriteEngine On
    RewriteOptions InheritDownBefore
    RewriteCond %{REQUEST_URI} ^/\.well\-known
    RewriteRule . - [L,PT]
</IfModule>

Тогда вы можете сделать это в каждом из ваших vhosts, без каких-либо других указаний:

<VirtualHost *:80>
    ....
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^/.*            /index.php [L,PT]
    </IfModule>
</VirtualHost>
0 голосов
/ 26 июня 2011

Я всегда использовал "всеобъемлющий" 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 .... оба так гораздо логичнее ..

...