mod_rewrite: иерархические поддомены в иерархические подкаталоги - PullRequest
2 голосов
/ 12 февраля 2010

Рассмотрите следующую проблему, пожалуйста. У меня есть domain.tld с иерархическими поддоменами, такими как:

a.domain.tld
b.a.domain.tld
c.b.a.domain.tld
... etc.

Существует также гипотетическая структура каталогов в корне сети:

/foo
/a.
/a./b.
/a./b./bar
/a./b./c.
... etc.

Я бы хотел добиться такого переписывания, чтобы Apache обслуживал каталоги так, как вы видите ниже.

a.domain.tld      -->  /a.
b.a.domain.tld    -->  /a./b.
c.b.a.domain.tld  -->  /a./b./c.
... etc.

Каталоги без завершающего символа точки будут вести себя как обычные подкаталоги.

domain.tld/foo/    --> /foo
a.b.domain.tld/bar --> /a./b./bar

Я не могу использовать mod_vhost_alias и был бы рад, если бы решение было достижимо, используя только mod_rewrite. Можно ли добиться такой перезаписи?

Спасибо за все ваши советы.

-
NKD

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Возможное решение для 4 уровней поддоменов:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.tld
RewriteRule (.*) %1./$1 [R,L]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.domain\.tld
RewriteRule (.*) %2./%1./$1 [R,L]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.domain\.tld
RewriteRule (.*) %3./%2./%1./$1 [R,L]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.domain\.tld
RewriteRule (.*) %4./%3./%2./%1./$1 [R,L]

Спасибо.

-
NKD

1 голос
/ 18 февраля 2010

Предыдущее решение заканчивается очень забавным бесконечным циклом перенаправления. Вот решение, которое я получил сейчас (не очень элегантно, но оно работает; но с огромным «но»):

# Working solution for five levels of sub-domains

RewriteEngine on

RewriteCond %{HTTP_HOST} ^([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC]

RewriteRule (.*) http://DOMAIN.TLD/%5./%4./%3./%2./%1./$1 [R,L]

Может кто-нибудь объяснить мне, почему (черт возьми) это работает? Это действительно работает, я тщательно его протестировал. Но почему это работает на самом деле? Если я посмотрю на строку RewriteRule, я сомневаюсь, что она должна работать ... Спасибо за ваши объяснения.

Кстати: если вышеперечисленные пять условий перезаписи и правила работают, похоже, что они могут быть переписаны каким-то «двухстрочным» (одно условие плюс одно правило) Я уже пробовал это, используя приведенное выше правило и следующее условие вместо пяти приведенных выше условий:

RewriteCond %{HTTP_HOST} ^(([^\.]+)\.)+DOMAIN\.TLD [NC]

и немного поиграл, но без особого успеха. Спасибо за все идеи, как упростить переписать материал и сделать его более «вменяемым» (если это возможно).

-
NKD

0 голосов
/ 12 февраля 2010

Это возможно, если вы отправляете деталь, которая будет изменена, во внешний сценарий с помощью RewriteMap и обрабатываете ее.

...