Mod rewrite mod_rewrite:分层子域到分层子目录

Mod rewrite mod_rewrite:分层子域到分层子目录,mod-rewrite,apache2,subdirectory,subdomain,hierarchical,Mod Rewrite,Apache2,Subdirectory,Subdomain,Hierarchical,请考虑以下问题。我得到了domain.tld,其中包含如下分层子域: a.domain.tld b.a.domain.tld c.b.a.domain.tld ... etc. web根目录中还有一个假设的目录结构: /foo /a. /a./b. /a./b./bar /a./b./c. ... etc. 我希望实现这样的重写,使Apache以您在下面看到的方式为目录提供服务 a.domain.tld --> /a. b.a.domain.tld --> /

请考虑以下问题。我得到了domain.tld,其中包含如下分层子域:

a.domain.tld
b.a.domain.tld
c.b.a.domain.tld
... etc.
web根目录中还有一个假设的目录结构:

/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_别名,如果仅使用mod_rewrite就可以实现该解决方案,我将非常高兴。有可能实现这样的重写吗

谢谢你的建议

--

nkd

如果您通过将要反转的部分发送到外部脚本,并让外部脚本处理它,则是可能的。

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

前面的解决方案以非常有趣的无限重定向循环结束。下面是我现在得到的一个解决方案(不是很优雅,但它可以工作;但是有一个巨大的“但是”):

有人能给我解释一下为什么(该死的)它会起作用吗?它确实有效,我对它进行了广泛的测试。但为什么它真的有效呢?如果我看一下重写规则行,我怀疑它是否有效。。。谢谢你的解释

顺便说一句:如果上述五个重写条件和规则都有效,看起来可以用某种“两行”(一个条件加一个规则)重新编写。我已经尝试过了,使用上述规则和以下条件,而不是上面给出的五个条件:

RewriteCond %{HTTP_HOST} ^(([^\.]+)\.)+DOMAIN\.TLD [NC]
玩了一点,但没有真正的成功。感谢所有关于如何简化的想法 重写内容,使其更“理智”(如果可能)

--

你好。谢谢你的快速回复。我知道这张地图。如果可能的话,我宁愿不使用它。是吗?没有内置的mod_重写功能可以拆分、反转然后加入。谢谢。这意味着我需要为10级子域编写10套规则,对吗?有人能告诉我如何正确地处理前两个层次(我想我自己会很容易地推导出下一个8)。层次结构将不会重叠大约10或12个级别。不应该有^([^\.]+)\.example\.com。。。等等,在第二个?(开头“^”)是的,那可能会有帮助。
RewriteCond %{HTTP_HOST} ^(([^\.]+)\.)+DOMAIN\.TLD [NC]