Подстановочный знак при перезаписи DocumentRoot для виртуального хоста

Подстановочный знак при перезаписи DocumentRoot для виртуального хоста

Я использую эту конфигурацию в apache2 для поддомена wildcard и она работает хорошо:

 <VirtualHost _default_:80>
   UseCanonicalName off
   Options FollowSymLinks
   VirtualDocumentRoot /var/www/domains/%0/httpdocs

    RewriteEngine On

    RewriteCond   %{HTTP_HOST}      ^\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
    RewriteRule   ^(.+)             /var/www/domains/localhost/httpdocs/$1 [L]

    RewriteCond   %{HTTP_HOST}      !^[^.]+\.abc\.net [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.example\.me [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.mysite\.info [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.xyz\.org [NC]
    RewriteCond   %{HTTP_HOST}      !\.internal$ [NC]
    RewriteCond   %{REQUEST_URI}    !^/collateral/ [NC]

    RewriteRule   ^(.+)             /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1
    ErrorDocument 403 /error/404.php

Это означает запрос на "http://sub.abc.net" извлечет корневой каталог документа "/var/www/domains/sub.abc.net/httpdocs" и запросит "http://sub.xyz.org" извлечет корневой каталог документа "/var/www/domains/sub.xyz.org/httpdocs".

Но я хочу, чтобы запрос к *.abc.net был переписан в *.xyz.org documentroot.

решение1

Нам нужно, чтобы любой .orgдомен перенаправлялся на .netдомен documentroot

Я предполагаю, что вы имеете в виду «переписать», а невнешнее «перенаправление», как код в вашем вопросе? (Вы также изменили направление необходимой переписывания, как указано в вашем вопросе, но в любом случае я пойду с тем, что вы указали в комментариях... .orgв `.net)

Это предполагает, что у вас есть только одноуровневые TLD, на которые ссылаются в вашем коде (например, .net, .me, .info, .org, и т. д.), а не многоуровневые «TLD», такие как .co.uk.

RewriteCond   %{HTTP_HOST}      !^[^.]+\.abc\.net [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.example\.me [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.mysite\.info [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.xyz\.org [NC]
RewriteCond   %{HTTP_HOST}      !\.internal$ [NC]
RewriteCond   %{REQUEST_URI}    !^/collateral/ [NC]
RewriteRule   ^(.+)             /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1

Попробуйте вместо этого сделать что-то вроде следующего:

# If any of these domains are requested then stop
RewriteCond %{HTTP_HOST}      ^[^.]+\.abc\.net [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.example\.me [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.mysite\.info [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.xyz\.org [NC,OR]
RewriteCond %{HTTP_HOST}      \.internal$ [NC,OR]
RewriteCond %{REQUEST_URI}    ^/collateral/ [NC]
RewriteRule ^ - [L]

# Split the requested host into HOSTNAME + TLD (env vars)
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)\.([^.]+)
RewriteRule ^ - [E=HOSTNAME:%1,E=TLD:%2]

# Change TLD "org" to "net"
RewriteCond %{ENV:TLD} =org [NC]
RewriteRule ^ - [E=TLD:net]

RewriteRule (.+) /var/www/domains/%{ENV:HOSTNAME}.%{ENV:TLD}/httpdocs/%{ENV:HOSTNAME}.%{ENV:TLD}/$1 [L]

Первый блок директив меняет ваши текущие условия на противоположные. То есть, он говорит, что если запрос относится к любому из «этих доменов», то прекратить обработку, вместо... переписывать только тогда, когда запроснетсоответствует любому из "этих доменов". Это упрощает следующие правила, поскольку теперь мы знаем, что запрошенный хост — это тот, который мы хотим переписать, поэтому нам не нужно засорять код дополнительными условиями.

Затем мы разделяем запрошенное HTTP_HOSTнаимя хоста(поддомен + домен) итлдтолько. И сохраните их в двух переменных окружения: HOSTNAMEи TLDсоответственно.

Затем мы проверяем TLDпеременную окружения и при необходимости изменяем ее (например, orgна net).

И, наконец, есть безусловная перезапись в соответствующий корень документа и подкаталог (используя переменные окружения, назначенные выше), как в вашем коде. Обратите внимание, что вы указали только "корень документа" в своем описании, но ваш код также включает подкаталог с тем же именем, поэтому я включил и подкаталог.

Это предполагает, что директивы mod_rewrite, указанные в вашем вопросе, являются полными. т.е. Нет других зависимых директив ниже по конфигурации? Я добавил флаг Lдля пущей уверенности.

Связанный контент