Я использую эту конфигурацию в apache2 для поддомена с подстановочными знаками и хорошо работает:
<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.
Нам нужны любые
.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
в имя хоста (субдомен + домен) и tld только. И сохраните их в двух переменных среды: HOSTNAME
и TLD
соответственно.
Затем мы проверяем TLD
env var и при необходимости измените его (т.е. org
к net
).
И, наконец, существует безусловная перезапись в соответствующий корень документа и подкаталог (с использованием переменных env, назначенных выше), как в вашем коде. Обратите внимание, что в описании вы указали только «корень документа», но ваш код также включает подкаталог с таким же именем, поэтому я также включил подкаталог.
Это предполагает, что директивы mod_rewrite, указанные в вашем вопросе, выполнены. т.е. Дальше по конфигу нет других зависимых директив? Я добавил L
флаг на всякий случай.