.htaccess 重写一个特殊目录的条件,而其他所有请求都通过

.htaccess 重写一个特殊目录的条件,而其他所有请求都通过

我是 mod_rewrite 的新手。我的问题:我有两条规则相互冲突。

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

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

现在我的文档根目录中有一个包含 php 脚本的文件夹,我们将其称为“specialdir”。如何将请求重定向www.mydomain.com/special到 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]

答案1

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

^但是,第二条规则还有其他问题。通过用和来“结束”正则表达式,$您将只能special精确匹配,special/而不会匹配 ,也不会匹配special/foobar

此外,替换部分包含$1将被括号内匹配的内容替换的内容。由于模式中没有括号,因此$1替换中的 会造成混淆。

你可能想要的是这个:

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

并确保它位于文件中前面提到的重写之上。

相关内容