【问题标题】:Serving files from multiple root directories in apache在 apache 中从多个根目录提供文件
【发布时间】:2015-03-28 16:05:05
【问题描述】:

我想在 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 应该在目录标签之外工作吧?

更新:请参阅下面的@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>

【问题讨论】:

    标签: apache mod-rewrite httpd.conf


    【解决方案1】:

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

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

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

    【讨论】:

    • 不,实际上我想要达到的效果与此类似:http://example.com/hello.jpg 应该映射到 /home/villermen/httpd/media/hello.jpg(如果存在),否则它应该只从 documentroot 加载。 (/home/villermen/httpd/root/hello.jpg)。一个简单的别名在这里是不够的,因为它不允许这种失败行为。
    • 是否可以将media 目录保留在DocumentRoot 中。即将媒体作为/home/villermen/httpd/root/media 放在里面?因为DocumentRoot之外的文件的重写规则会有点复杂。
    • 嗯,从技术上讲是可以的。但我想将包含、根和媒体目录分开在同一级别。
    • @Villermen 更新了我的答案。使用该配置,您可以在DocumentRoot 之外拥有media/ 目录。
    • 我已经以类似的方式解决了它,我仍然会将您的答案标记为首选答案,因为它基本上做同样的事情。我的解决方案最终变成了这样......好吧,内联代码不是 stackoverflow 在 cmets 中所做的事情,我会将其添加到我的原始帖子中。感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    相关资源
    最近更新 更多