apache的.htaccess文件重写 RewriteRule ^index\.php$ - [L]
Rewrite重写任务基本上都是由 RewriteCond 和 RewriteRule 两个命令配合完成。
RewriteBase / 规定根目录为基准路径,
RewriteCond 规定重写的条件,如果条件成立,那么将会执行 RewriteRule 所规定的重写规则。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
下面来解释一下各行含义
<IfModule mod_rewrite.c> #如果mode_rewrite.c模块存在 则执行以下指令
RewriteEngine On #开启rewriteEngine
RewriteBase / #重写范围,这里/为本地顶级目录
RewriteRule ^index\.php$ – [L] #重写规则
^index\.php$是匹配正则表达式,只匹配了index.php
后面的短线 如果我没记错的话 就是指null
NC: no case, 就是说不区分大小写
R:redirect, 重定向,R的含义是redirect,即重定向,该请求不会再被apache交给后端处理,而是直接返回给浏览器进行重定向跳转。301是返回的http状态码。
F:forbidden, 禁止访问
L:last, 表示已经是最后一条规则,.htaccess文件解析即将退出
L是last,即最后一个rewrite规则,如果请求被此规则命中,将不会继续再向下匹配其他规则。
%{REQUEST_FILENAME} !-f 和!-d只对下一条RewriteRule起作用。再往下的RewriteRule不管用。
RewriteCond %{REQUEST_FILENAME} !-f (如果不是文件,才会执行下一条RewriteRule)
RewriteCond %{REQUEST_FILENAME} !-d (如果不是目录,才会执行下一条RewriteRule)
切记,只生效下一条,再下一条就不管用了,再下一条则会以全局形式匹配,没有条件判断。
%{REQUEST_FILENAME}表示请求的文件名
!-f不是一个文件
!-d不是一个目录
[L] 这是最后一个匹配项,不再往下匹配
[R]相当与redirect [NC]不区分大小写。