%{REQUEST_FILENAME} !-f 和!-d只对下一条RewriteRule起作用。再往下的RewriteRule不管用。
他的意思是
如果不是文件也不是目录,才会把这条URL交给以下RewriteRule执行,很明显,这是一个条件语句,与IF作用相同,但没有end if 他只对下一条语句有用,执行完下一条自动end if.
亲自测试。
如果伪静态有很多条,有些与网站的目录和文件有冲突的,则需要在前加一个条件判断。
RewriteCond %{REQUEST_FILENAME} !-f (如果不是文件,才会执行下一条RewriteRule)
RewriteCond %{REQUEST_FILENAME} !-d (如果不是目录,才会执行下一条RewriteRule)
切记,只生效下一条,再下一条就不管用了,再下一条则会以全局形式匹配,没有条件判断。
例:
我的伪静态是
1 域名/aaa/ 转换成 index.php/?catname=aaa
2 域名/aaa/bbb/ 转换成 index.php/?catname=aaa&catname2=bbb
但是如果phpmyadmin也会同样转换,样式路径 css/aaa/ 同样也会被转换
之前我做的伪静态规则是最上方写这2条判断,下面全部写下规则,但出现问题了。
我把1放到这2条判断语句下面,那么网站所有一级目录都没有问题,但二级目录就有问题,三级目录也没问题,因为没有三级目录的RewriteRule。
经过多方面寻找原因,终于找到,原来这2条判断语句,只能生效他的下一条RewriteRule规则。所以我必须写2个。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^域名/aaa/ index.php/?catname=$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^域名/aaa/bbb/ index.php/?catname=$1&catname2=$2
如果有的伪静态规则是文件,而且与网站真实文件有冲突,则同理。不过一般不会出现什么问题。主要是目录。
最保险的写法就是每一条RewriteRule前面都写一个判断。
例
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^域名/aaa/(\d+).html index.php/?catid=$2
这是我的亲自测试的结果,可能有些错误,希望多多交流。