2

请考虑以下问题。我有 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

4

3 回答 3

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 行,我怀疑它应该可以工作...谢谢您的解释。

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

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

并玩了一点,但没有真正的成功。感谢所有关于如何简化重写内容并使其更加“理智”(如果可能)的想法。

--
NKD

于 2010-02-17T22:40:45.650 回答
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

于 2010-02-12T02:03:31.460 回答
0

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

于 2010-02-12T01:37:56.800 回答