2011-11-15 90 views
3

我有點難以讓mod_rewrite做我需要它做的事情。mod_rewrite來縮短url文件路徑

我們在Drupal安裝中有一組虛擬子域。所以,academics.univ.edu,about.univ.edu等都是同一個核心Drupal安裝的一部分。

目前的文件訪問是academics.univ.edu/sites/all/academics/files/myfile.jpg。但是,此路徑也可以作爲about.univ.edu/sitse/all/about/files/myfile.jpg或任何其他有效的子域名。

我們希望使用mod_rewrite接受academics.univ.edu/files/myfile.jpg並從上述位置傳遞文件。

這是我已經試過:

RewriteCond %{REQUEST_URI} ^(about|academics|bursar|calendar)\.univ\.edu\/files\/(.*)$ [NC] 
RewriteRule ^/sites/all/files/$1/$2 [L,NC] 

我可能要對這個錯誤的方式,但我想查就可以了。我可以通過使用HTTP_HOST制定單獨的規則來使子域工作,但我希望文件中的規則更少。另外,我無法讓HTTP_HOST在作爲子目錄中的子目錄存在的網站上工作。例如,undergrad.univ.edu/biology/files/myfile.jpg應提供/sites/all/biology/files/myfile.jpg

回答

2

您無法在%{REQUEST_URI}中匹配主機,您需要要使用%{HTTP_HOST},然後使用%1反向推薦來訪問該匹配項。實際的URI可以在規則本身中匹配。事情是這樣的:

RewriteCond %{HTTP_HOST} ^(about|academics|bursar|calendar)\.univ\.edu$ [NC] 
RewriteRule ^files/(.*)$ /sites/all/files/%1/%2 [L,NC] 

%1引用匹配(about|academics|bursar|calendar)中的RewriteCond和$1引用的重寫規則匹配(.*)。因此,該示例將請求http://about.univ.edu/files/foo.html並將請求重寫爲/sites/all/files/about/foo.html。另外,如果這是在虛擬主機或服務器配置中,則在RewriteRule中的「^」和「文件」之間需要「/」。

+0

非常感謝! –