Моя идея такова:
Мой хост настроен таким образом, что есть каталог 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]
.
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 (постоянный) - если это намерение - только после того, как вы убедитесь, что все работает нормально.
Перед тестированием необходимо очистить кеш браузера.