2014-11-25 52 views
0

我正在用apache重寫規則試驗一下,看看我的想法是否可行。我迄今這方面的工作對我來說:Apache重寫規則以遞歸方式將子域映射到子文件夾

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

這allowes我使用虛擬子域像abmy-使用domain.tld,在這種情況下將映射到子文件夾中的虛擬主機B的文檔根目錄。我-使用domain.tld。

我想實現的是遞歸解決方案,我可以使用abcmy-domain.tld映射到虛擬主機c.my-domain.tld或abcdmy-domain.tld的文件夾b/a以映射到虛擬主機d.my-domain.tld的文件夾c/b/a。

我可以只添加更多的規則來獲得兩個或三個級別的工作,但如果存在啓用無限遞歸級別的解決方案,它將會非常酷(並且更乾淨)。

回答

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"; 
} 

我敢肯定,它的醜陋和防止建議做這樣的事情,但它正在按我的意圖工作。所以如果沒有別的東西,那至少是一個概念證明。如果您對此解決方案有任何想法或改進,請留下評論。