什么是rewrite ?
rewrite 顾名思义就是重写的意思,主要是针对URL进行重写,采用方法是使用PCRE(Perl Compatible Regular Expressions) perl兼容正则表达式语法进行规则匹配。
其意义所在: 可以规范URL 根据变量来做URL转向和选择配置。
执行顺序
1.执行server块的rewrite指令,server {} 内部的rewrite;
2.执行location匹配(后面有介绍location);
3.执行选定的location中的rewrite指令(rewrite 可以写在location内);
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件
如果循环超过10次,则返回500 Internal Server Error错误
相关指令
return
- 语法
return code; - 作用
结束规则集的执行 并返回状态码给客户端,主要用于当url 中含有禁止访问的资源时给返回一些错误码; - 例子
服务器禁止客户端访问 .svn CVS Entries 等目录文件,可用下列表示
location ~* /(\.svn|CVS|Entries){
return 403;
}
if
- 作用
用来判断条件是否满足,如果满足则执行大括号里面的内容,注意:if 不支持嵌套,不支持多个条件&& 和 || 处理。 - 语法
if (condition) {...}
- condition 主要包含一下内容
- 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
- 直接比较:使用 == 或者 != 比较变量
- 正则匹配: ~ 表示区分大小匹配,~* 表示不区分大小匹配, !~ !~* 与 ~ ~* 相反表示不匹配
- -f 与 !-f 判断文件存在不存在
- -d 与 !-d 判断目录存在不存在
- -e 与 !-e 判断文件或者目录存在不存在
- -x 与 !-x 判断文件是否有可执行
- 例子
if ($host !~ "^((.*\.)?(test\.(com|com\.cn|cn)) {
return 403;
}
set
- 语法
set $variable value
- 作用
定义一个变量并给变量赋值; - 例子
set $appname 'hello'
break
- 作用
完成当前的规则集,不再处理rewrite指令; 语法
break例子
if ($slow) {
limit_rate 10k;
break;
}
rewrite
- 作用
重写URL 语法
rewrite pattern replacement [flag]flag
rewrite 语法最后一个参数为flag, 主要有一下几个:- last : 相当于Apache的[L]标记,表示完成rewrite
- break: 本条规则完成后,终止匹配,不再匹配后面的规则;
- redirect: 返回302临时重定向,地址栏会显示重定向后的地址;
- permanent: 返回301永久重定向,地址栏会显示重定向后的地址;
last与 beak 区别:
例子
rewrite "^(.*)$" http://test.com$1 permanent;
什么是location
location 与 rewrite 功能很类似,目的都是为了实现跳转,不过location 主要针对某一个路径/具体URL做控制访问/方向代理,proxy_pass 可以实现转发至其他机器,rewrite 主要针对路径做同一域名的路径做替换,并且rewirte 可以写在location 内;
location 匹配
- = : 表示精确匹配
- ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
- ~:表示区分大小的正则匹配
- ~* :表示不区分大小的正则匹配
- /:通配符,如果没有匹配到其他选项,则使用该选项;
匹配顺序 :
精确匹配(=) > 完整路径匹配 > ^~ > 正则匹配(~/~*) > 部分路径匹配 > 通用匹配(/)