我是 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]
并确保它位于文件中前面提到的重写之上。