2012-07-02 96 views
0

我一直試圖弄清楚這一點。我很抱歉,如果這是一個重複的問題,但我似乎無法找到合適的解決方案。Apache Mod_rewrite改變目錄

我試圖做到的是以下幾點:

給出的URL dev-<sub>.example.com/resources/path/to/resource,其中sub變化,去/var/www/devEx_<sub>/override/resources/path/to/resource,如果它產生一個文件或/var/www/devEx_<sub>/main/resources/path/to/resource以其他方式(我可以處理404)。

我可以找出一個解決方案,我手動添加每個人sub但我無法弄清楚如何使用通配符或反向引用。

我試過搞VirtualDocumentRoot,但我永遠不會得到devEx_<sub>部分顯示在DOCUMENT_ROOT檢查資源。

我嘗試使用類似於此[mod_rewrite regex (too many redirects)]的解決方案,但它總是與REQUEST_URI混淆。

我使用這樣的事情在過去的嘗試:

RewriteCond $1 (^resources/.*) 
RewriteCond %{DOCUMENT_ROOT}/override%{REQUEST_URI} -f 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/override%{REQUEST_URI} [QSA,L] 

RewriteCond $1 (^resources/.*) 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/main%{REQUEST_URI} [QSA,L] 

而且,我更喜歡使用Apache/mod_rewrite的更多可以這麼理解,如果你有一個良好的技術指導或指南建議,會幫助我使用這個或一些調試技術(因爲我不知道如何調試這些重寫規則),我非常感謝所有知識,所以請分享!

編輯

關於我的考驗更多的細節。

在我的VirtualDocumentRoot解決方案中,我能夠路由到正確的目錄,但無法將目錄設置爲文檔根目錄以執行覆蓋規則。

對於這種溶液[mod_rewrite regex (too many redirects)],我在conf設置DocumentRoot/var/www和放置在下面的行中的.htaccess文件在目錄

RewriteCond %{HTTP_HOST} ^dev-([^.]+)\.example\.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/devEx_%1 -d 
RewriteCond %{ENV:REDIRECT_STATUS} ="" 
RewriteRule .* /devEx_%1/$0 [L] 

然而,該附加devEx_<sub>%{REQUEST_URI},如你會期待的。

+0

這些規則似乎是在正確的方向 - 他們不工作? – Ansari

+0

您不希望'%{DOCUMENT_ROOT}/path1%{REQUEST_URI}'爲'%{DOCUMENT_ROOT}/override%{REQUEST_URI}'? –

+0

@Jon編輯翻譯錯誤。 – sgcharlie

回答

0

你爲什麼不使你的文檔根目錄的/ var/WWW/

這可能是你要做的,這取決於你服務還有什麼,是不是在最好的devEx目錄,因爲那些將需要重新路由。你想要的東西,看起來像這樣:

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/devEx_%1/override%{REQUEST_URI} -f 
RewriteRule ^(.*)$ /devEx_%1/override%{REQUEST_URI} [QSA,L] 

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC] 
RewriteRule ^(.*)$ /devEx_%1/main%{REQUEST_URI} [QSA,L] 

或者,你可以用/var/www取代%{DOCUMENT_ROOT}比如,儘管它是一種醜陋的,特別是如果你在其他地方移動網站或變更您的服務器配置。因此,你會得到這樣的東西:

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC] 
RewriteCond /var/www/devEx_%1/override%{REQUEST_URI} -f 
RewriteRule ^(.*)$ /var/www/devEx_%1/override%{REQUEST_URI} [QSA,L] 

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ 
RewriteRule ^(.*)$ /var/www/devEx_%1/main%{REQUEST_URI} [QSA,L] 
+0

在'/ var/www/devEx_ '中還有另一個.htaccess文件需要運行來做一些額外的重寫。有沒有什麼方法可以調用.htaccess文件,而不會弄亂'%{REQUEST_URI}'變量? – sgcharlie

+0

@sgcharlie首先,在將文檔根目錄更改爲'/ var/www /'no時,重寫將總是修改'%{REQUEST_URI}',第二個是'/ var/www /'是硬編碼的,%' {REQUEST_URI}'沒有改變。 –

+0

對,您的示例不會更改'%{REQUEST_URI}'變量。我只是想知道,除了這兩個規則列表之外,是否還有一種方法可以調用'/ var/www/devEx_ /.htaccess',而不會將'devEx_ '追加到'%{REQUEST_URI} ',如果這是有道理的。 – sgcharlie