从 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>
如果我的理解是正确的,你需要的是如下。
http://example.com/media/hello.jpg
应映射到 /home/villermen/httpd/media/hello.jpg
http://example.com/media/video/world.mp4
应映射到 /home/villermen/httpd/media/video/world.mp4
- 如果
media
目录中不存在该文件,则它应该 通过 HTTP 404 从 root
目录中获取图像。所以 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]
标志来添加更多媒体类型。
我想在 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>
如果我的理解是正确的,你需要的是如下。
http://example.com/media/hello.jpg
应映射到/home/villermen/httpd/media/hello.jpg
http://example.com/media/video/world.mp4
应映射到/home/villermen/httpd/media/video/world.mp4
- 如果
media
目录中不存在该文件,则它应该通过 HTTP 404从root
目录中获取图像。所以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]
标志来添加更多媒体类型。