Apache重写规则以递归方式将子域映射到子文件夹

时间:2014-11-25 09:24:45

标签: apache mod-rewrite recursion url-rewriting

我正在尝试使用apache重写规则来查看我的想法是否可行。到目前为止,我有这个为我工作:

# Dynamic subdomain->subfolder rewrite
RewriteCond %{HTTP_HOST} ^(.+)\.(.+)\.my-domain\.tld$ [NC]
RewriteCond %{REQUEST_URI} !^/%1/
RewriteRule (.*) /srv/web/%2/www/%1$1

这允许我使用虚拟子域,如a.b.my-domain.tld,在这种情况下,它将映射到虚拟主机b.my-domain.tld的文档根目录中的子文件夹a。

我想要实现的是递归解决方案,我可以使用abcmy-domain.tld映射到虚拟主机c.my-domain.tld的文件夹b / a,或者映射到abcdmy-domain.tld文件夹c / b / a虚拟主机d.my-domain.tld。

我可以添加更多规则以使两个或三个级别正常工作,但如果有一个解决方案可以启用无限级别的递归,那么它将非常酷(并且更加清晰)。

1 个答案:

答案 0 :(得分:0)

经过一些试验和错误后,似乎我找到了一个可行的解决方案。它并不像我希望的那样干净,但我认为只使用RewriteCond / RewriteRule是不可能的。

我最终使用了RewriteMap,我的配置现在是:

# Dynamic subdomain->subfolder rewrite
RewriteMap rewrite "prg:/etc/apache2/subdomainrewrite.php"
RewriteCond %{HTTP_HOST} ^(.+)\.(.+)\.my-domain\.tld$ [NC]
RewriteCond %{REQUEST_URI} !^/${rewrite:%1}/
RewriteRule (.*) /srv/web/%2/www/${rewrite:%1}$1

subdomainrewrite.php的内容是这样的:

#!/usr/bin/php
<?php
set_time_limit(0);
$input = fopen('php://stdin', 'r');
while (1) {
  $line = trim(fgets($input));
  echo implode('/', array_reverse(explode('.', $line))) . "\n";
}

我确信它很丑陋并建议不要做这样的事情,但它按照我的意愿工作。所以,如果没有别的,它至少是一个概念证明。如果您对此解决方案有任何想法或改进,请发表评论。