目前我的.htaccess文件中有这些规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*).css style.php?u=$1 [QSA]
RewriteRule ^(.*).xml rss.php?u=$1 [QSA]
</IfModule>
这将重写以下网址:
http://domain.com/user.css
http://domain.com/user.xml
但是当我试图从子目录中获取文件时:http://domain.com/css/style.css
它也会被重写。
我的目标是仅重写当前目录并避免子目录,因为子目录上的所有真实CSS文件都将被重写。
我怎能避免这种情况?
答案 0 :(得分:3)
您需要使您的模式更具限制性:此^(.*).css
将与.css
中的^([^/]+)\.css$
匹配,而此模式something.css
将限制为styles\something.css
({{1}不会匹配它。)
<IfModule mod_rewrite.c>
RewriteEngine On
# do not do anything to real files or folders
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]
RewriteRule ^([^/]+)\.css$ style.php?u=$1 [QSA,L]
RewriteRule ^([^/]+)\.xml$ rss.php?u=$1 [QSA,L]
</IfModule>
答案 1 :(得分:0)
最简单的方法是告诉mod_rewrite以避免在文件是真实文件时重写:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*).css style.php?u=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*).xml rss.php?u=$1 [L,QSA]
我添加了[L]
标记(结束),因为一旦应用了规则,您肯定不需要检查下一个规则。
现在,如果文件确实存在,但如果网址上没有'css'子目录,你真的想用PHP脚本处理它们......让我们试试:
<Location "/css">
RewriteEngine off
</Location>