Я использую эту конфигурацию в 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
для пущей уверенности.