Apache 访问 /media/ 而不是 DocumentRoot/media

Apache 访问 /media/ 而不是 DocumentRoot/media

我的 Apache 配置有以下语句:

    DocumentRoot /home/x/public/
    <Location />
       Order Allow,Deny
       Allow from all
      Options -ExecCGI -Indexes
    </Location>

/home/x/public/ 下有一个目录 /media

    RewriteRule ^(/media/.+) $1 [L]

媒体文件应保持不变并由 Apache 提供服务 - 其他请求则重定向到 Ruby on Rails 代理服务器。

每当我尝试通过浏览器访问 /media 下的文件时,Apache 都会尝试提供 /media/file(在文件系统根目录中),而不是 /home/x/public/media/file

如果我将 /media 重命名为 /medias,则文件 /home/x/public/media/file 可以正确提供。

我怎样才能阻止这种行为?

编辑:添加 mod_rewrite 日志:

如果“mv /media/ /medias”:

applying pattern '^(/media/.+)' to uri '/media/css/TableTools.css'
rewrite '/media/css/TableTools.css' -> '/media/css/TableTools.css'
local path result: /media/css/TableTools.css
prefixed with document_root to /home/x/public/media/css/TableTools.css
go-ahead with /home/x/public/media/css/TableTools.css [OK]

如果“mv /medias /media”:

applying pattern '^(/media/.+)' to uri '/media/css/TableTools.css'
rewrite '/media/css/TableTools.css' -> '/media/css/TableTools.css'
local path result: /media/css/TableTools.css
go-ahead with /media/css/TableTools.css [OK]

答案1

来自RewriteRule 文档(注:重点是我的):

重写规则的替换是替换模式匹配的原始 URL 路径的字符串。替换可能是:

文件系统路径

指定要传递给客户端的资源在文件系统上的位置。只有在以下情况下,替换才会被视为文件系统路径:该规则是在服务器(虚拟主机)上下文中配置的,并且替换中的路径的第一个组件存在于文件系统中

因为文件系统中存在“/media”,所以你遇到了“替换”字符串的这种解释。更好的方法是

RewriteRule ^(/media/.+) - [L]

这里-的意思是“根本不重写,只应用附加到 RewriteRule 的标志” - 因此在这种情况下[L]将应用标志,并且 mod_rewrite 不会尝试对此请求使用任何其他规则。

相关内容