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

时间:2015-01-29 12:17:35

标签: apache mod-rewrite httpd.conf

我想在apache中创建一个设置,我的媒体文件从我的代码中拆分(以便于项目管理)。我创建的想法是有一个根目录(/ home / villermen / httpd / root),其中包含所有代码(php文件,css文件等)和一个媒体目录(/ 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/$1"

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

我在ubuntu 14.04上使用apache 2.4。

编辑:完全删除RewriteCond仍然不会发生任何魔法。 mod_rewrite应该在Directory标签之外工作吗?

更新:请参阅@ 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/$1"
</Directory>

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

1 个答案:

答案 0 :(得分:2)

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

  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 404 root目录中获取图像。因此http://example.com/media/video/world.mp4应映射到/home/villermen/httpd/root/video/world.mp4

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

    <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}..$1" [L]
    
        RewriteRule /media/(.*) /$1 [L]
    
    </VirtualHost>
    

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