mod_rewrite缩短url文件路径

时间:2011-11-15 21:31:53

标签: mod-rewrite ubuntu apache2

让mod_rewrite做我需要它做的事情我有点困难。

我们在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

1 个答案:

答案 0 :(得分: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引用RewriteCond中的匹配(about|academics|bursar|calendar)$1引用RewriteRule中的匹配(.*)。因此,该示例将向http://about.univ.edu/files/foo.html发送请求,并将请求重写为/sites/all/files/about/foo.html

此外,如果这是在虚拟主机或服务器配置中,则在RewriteRule中的“^”和“files”之间需要“/”。