php

apache的.htaccess文件重写 RewriteRule ^index\.php$ - [L]

2023-03-23

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]不区分大小写。