我的Apacheconfiguration有以下语句:
DocumentRoot /home/x/public/ <Location /> Order Allow,Deny Allow from all Options -ExecCGI -Indexes </Location>
在/ home / x / public /目录下有一个目录/
RewriteRule ^(/media/.+) $1 [L]
媒体文件应该保持不变并由Apache提供 – 其他请求被redirect到Ruby on Rails代理服务器。
每当我尝试通过浏览器访问/ media下的文件时,Apache会尝试提供/ media / file(在文件系统根目录上)而不是/ home / x / public / media / file
如果我将/ media重命名为/ medias,文件/ home / x / public / media /文件将被正确地提供。
我怎样才能防止这种行为?
编辑:添加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]
从RewriteRule文档 (重点是我的):
重写规则的replace是replace与Pattern匹配的原始URLpath的string。 换人可能是:
文件系统path
指定要传递给客户端的资源的文件系统上的位置。 在服务器(虚拟主机)上下文中configuration规则时,replace仅作为文件系统path处理,replace中的第一个组件位于文件系统中
由于文件系统中存在“/ media”,因此您正在对“replace”string进行这种解释。 一个更好的方式来做你想做的事情
RewriteRule ^(/media/.+) - [L]
-意思是“根本不重写,只应用附加在RewriteRule上的标志” – 所以在这种情况下, [L]标志将被应用,并且mod_rewrite将不会尝试使用这个请求的任何其他规则。