.htaccess rewriteCondition为一个特殊的目录,而所有其他请求通过

我是mod_rewrite的新手。 我的问题:我有两个规则相互碰撞。

在我的文档根目录中,我曾经只有一个.htaccess将所有传入的请求redirect到一个fast-cgi脚本,如下所示:

RewriteRule ^(.*)$ fcgi-bin/python-script.fcgi/$1 [QSA,L] 

现在我有一个文件夹在我的文档根目录中的PHP脚本,我们称之为“specialdir”。 如何将请求从www.mydomain.com/specialredirect到php的specialfolder而其余的请求仍然发送到fcgi脚本?

我试过了

 RewriteRule ^special$ specialfolder/$1 [QSA,L] 

但是这个请求显然仍然是由我的“catch all” ^(.*)$指令处理的。

我应该包括某种情况吗? 它将如何看?

编辑 :我完整的.htaccess文件

 AddHandler fastcgi-script .fcgi RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f AuthType Basic AuthName "login" AuthUserFile /var/www/v/htuser Require valid-user #php rewrite RewriteRule ^special/(.*) specialfolder/$1 [QSA,L] #trac rewrite RewriteRule ^trac(.*)$ fcgi-bin/trac-proj/$1 [QSA,L] #django rewrite RewriteRule ^(.*)$ fcgi-bin/django/$1 [QSA,L] RewriteRule ^media/(.*)$ fcgi-bin/django/media/$1 [QSA,L] 

重写规则按照它们在.htaccess文件中列出的顺序进行应用。 如果将第二条规则移到第一条规则上方,则优先。

但是,第二条规则还有其他问题。 通过用“ ^$ ”bookending“你的正则expression式,你将只匹配specialspecial/不匹配,也不会special/foobar

此外,replace部分包含$1 ,将被括号内的匹配内容replace。 由于你的模式中没有括号,replace中的$1是令人困惑的。

你可能想要的是这样的:

 RewriteRule ^special/(.*) specialfolder/$1 [QSA,L] 

并确保它高于前面提到的重写在文件中。