从 apache 中的多个根目录提供文件

Serving files from multiple root directories in apache

我想在 apache 中创建一个设置,将我的媒体文件从我的代码中分离出来(以便于项目管理)。我创建的想法是拥有一个包含所有代码(php 文件、css 文件等)的根目录 (/home/villermen/httpd/root) 和一个媒体目录 (/home/villermen/httpd/media)其中包含所有非文本文件。

执行此设置已被证明是棘手的。我正在尝试使用 mod_rewrite 来提供媒体目录中的文件(如果存在),但到目前为止我还没有成功。

这是我的 httpd.conf 部分,我试图在其中实现奇迹:

DocumentRoot /home/villermen/httpd/root
RewriteEngine on

<Directory /home/villermen/httpd/root>
    Order allow,deny
    Allow from all
    AllowOverride All

    #...other magic magoo, including rewriterules that do work
</Directory>

<Directory /home/villermen/httpd/media>
    Order allow,deny
    Allow from allow
    AllowOverride All
</Directory>

#Serve from media if file exists there
RewriteCond "/home/villermen/httpd/media%{REQUEST_URI}" -f
RewriteRule "^/?(.*)$" "/home/villermen/httpd/media/"

尝试访问媒体文件夹中存在的文件仍然会抛出 404,我在这里不知所措。有什么我没看到的吗?

我在 ubuntu 14.04 上使用 apache 2.4。

编辑:完全删除 RewriteCond 仍然不会产生任何奇迹。 mod_rewrite 应该在目录标签之外工作吧?

更新:请参阅下面@kannan-mohan 的可能答案。最后我采用了将媒体文件夹从 webroot 链接到它的文件夹然后将所有内容重写到那里的方法:

DocumentRoot /home/villermen/httpd/root
Alias /media /home/villermen/httpd/media

<Directory /home/villermen/httpd/root>
    #Serving files from media if they exists there
    RewriteCond "/home/villermen/httpd/media%{REQUEST_URI}" -f
    RewriteRule "^(.*)$" "/media/"
</Directory>

<Directory /home/villermen/httpd/media>
    Order allow,deny
    allow from all
    AllowOverride All
</Directory>

如果我的理解是正确的,你需要的是如下。

  1. http://example.com/media/hello.jpg 应映射到 /home/villermen/httpd/media/hello.jpg
  2. http://example.com/media/video/world.mp4 应映射到 /home/villermen/httpd/media/video/world.mp4
  3. 如果 media 目录中不存在该文件,则它应该 通过 HTTP 404root 目录中获取图像。所以 http://example.com/media/video/world.mp4 应该映射到 /home/villermen/httpd/root/video/world.mp4

在这种情况下,下面的配置就足够了。

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /home/villermen/httpd/root

    RewriteEngine on
    RewriteCond "%{DOCUMENT_ROOT}..%{REQUEST_URI}" -f
    RewriteCond %{REQUEST_URI} .*\.jpg$ [OR]
    RewriteCond %{REQUEST_URI} .*\.mp4$
    RewriteRule (.*) "%{DOCUMENT_ROOT}.." [L]

    RewriteRule /media/(.*) / [L]

</VirtualHost>

为了增加安全性,RewriteCond 还将检查请求的文件是 jpg 还是 mp4 类型,然后才会进行重写。可以通过在每个条件末尾附加 [OR] 标志来添加更多媒体类型。