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

时间:2010-02-12 01:35:41

标签: mod-rewrite apache2 subdirectory subdomain hierarchical

请考虑以下问题。我有domain.tld和分层子域,如下所示:

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

web-root中还有假设的目录结构:

/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 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

如果您通过RewriteMap将要反转的部分发送到外部脚本,并且可以处理它。