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

StackOverflow https://stackoverflow.com/questions/344588

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

Боже мой!

Это было полезно?

Решение

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

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

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

(Источник)

Apache поддерживает это начиная с версии 2.4.8 (недоступно на момент первоначального вопроса).

Из документации для RewriteOptions:

Наследование вниз

Если этот параметр включен, все дочерние конфигурации унаследуют конфигурацию текущей конфигурации.Это эквивалентно указанию RewriteOptions Inherit во всех дочерних конфигурациях.Смотрите параметр Наследовать для получения более подробной информации о том, как обрабатываются отношения родитель-потомок.Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.

Наследование ранее

Как и InheritDown выше, но правила из текущей области применяются перед правилами, указанными в любой дочерней области.Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.

Игнорировать наследство

Этот параметр заставляет текущую и дочерние конфигурации игнорировать все правила, которые были бы унаследованы от родительского параметра, указывающего InheritDown или InheritDownBefore.Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.

(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions)

Другие советы

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

RewriteEngine On
RewriteOptions Inherit 

щелчок http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html чтобы найти дополнительную информацию

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

RewriteOptions inherit

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

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

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

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

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

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

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>

Я всегда использовал "универсальный" 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 для Чероки..к злобно лаконичному NGinx конфигурация....и то, и другое гораздо более логично..

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

Пример глобального псевдонима 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>

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

<VirtualHost *:80>
    ....
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^/.*            /index.php [L,PT]
    </IfModule>
</VirtualHost>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top