Назад | Перейти на главную страницу

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

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