2

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

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

ответ

0

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

+0

Здравствуйте. Спасибо за быстрый ответ. Я знаю RewriteMap. Я бы предпочел не использовать его, если это возможно. Это? – nkd

+0

Нет встроенного средства mod_rewrite, которое разбивает, реверсирует, а затем соединяется. –

+0

Спасибо. Значит, мне нужно написать 10 наборов правил для, скажем, 10 уровней поддоменов, так? Может ли кто-нибудь показать мне, как сделать это правильно, скажем, первые два уровня (я думаю, что я буду следующим 8 легко, я думаю). Иерархия не будет перекрывать около 10 или 12 уровней. – nkd

1

Возможное решение 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

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

# 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, я сомневаюсь, что она должна работать ... Спасибо за ваши объяснения.

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

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

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

-
NKD

Смежные вопросы