.htaccess redirect/rewrite many domains to many domains

Моя идея такова:

  • запросы к service.example.com должны перенаправляться на service.example.com,
  • все остальные запросы к example.com должны перенаправляться на base.example.com

Мой хост настроен таким образом, что есть каталог example.com, а все поддомены живут в своих подкаталогах (example.com/service, example.com/base и т.д.).

Как мне добиться нужных перенаправлений?

Я пробовал использовать RedirectMatch, RewriteCond, RewriteRule, но безрезультатно. Я пробовал так:

    RewriteCond %{HTTP_HOST} ^service\.example\.com$ [NC]
    RewriteRule ^(.*)$ http://service.example.com/$1 [R=301,L]

    RewriteCond %{HTTP_HOST} !^base\.example\.com$ [NC]
    RewriteRule ^(.*)$ http://base.example.com/$1 [R=301,L]

Это сработало только для base.example.com. Для service.example.com был цикл переписываний/перенаправлений.

Я смог найти только примеры простых переписываний, один домен -> другой домен, или много доменов -> один домен, но мой случай отличается: много доменов -> много других доменов.

EDIT: OK, я получил его с:

RewriteCond %{HTTP_HOST} ^service\.example\.com$ [NC]
RewriteRule ^(.*)$ - [L]

RewriteCond %{HTTP_HOST} !^base\.example\.com$ [NC]
RewriteRule ^(.*)$ http://base.example.com/$1 [R=301,L]

Ключом было использование правила, чтобы ничего не делать: - [L].

2
задан 21 January 2021 в 13:45
1 ответ
 RewriteCond% {HTTP_HOST} ^ service \ .example \ .com $ [NC] 
RewriteRule ^ (. *) $ - [L] {{1} } 
RewriteCond% {HTTP_HOST}! ^ Base \ .example \ .com $ [NC] 
RewriteRule ^ (. *) $ Http://base.example.com/$1 [R = 301, L] 
 

Или просто ...

RewriteCond %{HTTP_HOST} !^(base|service)\.example\.com$
RewriteRule (.*) http://base.example.com/$1 [R=301,L]

ОДНАКО ... Если вы помещаете этот файл .htaccess в родительский каталог (который, я полагаю, вы должны ), то это, вероятно, не будет работать должным образом, поскольку «скрытый» подкаталог (на который указывает поддомен) также будет захвачен шаблоном RewriteRule и включен в перенаправление. (Или это намерение?!)

Например, если задан поддомен foo , который указывает на соответствующий подкаталог example.com/foo , и вы запрашиваете http: : //foo.example.com/bar , то указанная выше директива перенаправит запрос на http://base.example.com/foo/bar , а не на http: / /base.example.com/bar (что, как я предполагаю, было намерением). Это связано с тем, что шаблон RewriteRule фиксирует путь к файлу (которому соответствует URL-адрес) в этом контексте, а не URL-путь.

Чтобы решить эту проблему, вам нужно вместо этого использовать серверную переменную REQUEST_URI , которая содержит запрошенный путь URL относительно корня.

Например:

RewriteCond %{HTTP_HOST} !^(base|service)\.example\.com$
RewriteRule ^ http://base.example.com%{REQUEST_URI} [R=302,L]

Сначала протестируйте с 302 (временным) перенаправлением, чтобы избежать потенциальных проблем с кешированием, и измените его на 301 (постоянный) - если это намерение - только после того, как вы убедитесь, что все работает нормально.

Перед тестированием необходимо очистить кеш браузера.

0
ответ дан 24 April 2021 в 00:23

Теги

Похожие вопросы