首先我们看一下这个.htaccess文件:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L]
这里面涉及到了3个指令:
1、RewriteEngine 最简单,控制重定向引擎的开关。第一条指令表示打开重定向引擎。
2、RewriteCond 指令稍微复杂一些。每一条这个指令定义一个条件,只有这个条件满足时,跟在这个指令之后的那条 RewriteRule 才会起作用。注意:这个指令只为之后的一条 RewriteRule 指令提供条件!比如,上面文件中的第二条 RewriteRule 指令就不需要必须在之前的 RewriteCond 指令满足的情况下才执行。
如果想同时判断多个条件的话,可以在后面加上 [OR] 标志,表示暂时不结束判断,继续看下一条 RewriteCond 指令。
这条指令的第二个参数是被判断的值,在这里是服务器变量 %{REQUEST_FILENAME}
第三个参数是匹配模式,文件当中用到的几个匹配模式的意思分别为:
-s 判断第二个参数是否是服务器上存在的,大小大于0的常规文件;
-l 判断第二个参数是否是服务器上存在的,符号链接文件;
-d 判断第二个参数是否是服务器上存在的,文件夹;
如果符合这三条中的任意一条,就会执行第一条 RewriteRule 指令。
3、那么就让我们来看看 RewriteRule 指令。
RewriteRule 指令的第二个参数是个正则表达式。第一个起作用的 RewriteRule 指令的正则会应用于请求的URL地址(urlencode那种的);之后的RewriteRule指令则将正则应用于上一条指令的结果。
这条指令的第三个参数是被替换的值。- 表示保持原样,不替换。
这条指令后面也可以加标志。比如 NC 标志的意思是 no case,L 标志就是 停止下面的 RewriteRule 指令的执行。
所以,ZF这个文件的意思就是如果是服务器中存在的文件,就不要做重定向;如果请求路径中的文件不存在,就重定向到index.php。