请考虑以下问题。我有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
答案 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
将要反转的部分发送到外部脚本,并且可以处理它。