我怎样才能在当前目录中使用mod_rewrite?

时间:2011-07-15 10:34:01

标签: apache .htaccess mod-rewrite

目前我的.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文件都将被重写。

我怎能避免这种情况?

2 个答案:

答案 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>