Nginx-rewrite
一、nginx rewrite规则
1.rewrite语法
- nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。
- 该模块需要PCRE支持,因此应在编译nginx时指定PCRE源码目录, nginx安装方法。
1 | rewrite regex replacement [flag] |
2.rewrite flags标记位
flag | description |
---|---|
last | 本条规则匹配完成后,继续向下匹配新的location URL规则。(基本上都用这个Flag,表示rewrite。) |
break | 本条规则匹配完成即终止,不在匹配后面的任何规则 |
redirect | 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址 |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。原有的url支持正则,重写的url不支持正则 |
3.正则表达式匹配规则
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
4.文件及目录匹配
- -f 和!-f 用来判断是否存在文件
- -d 和!-d 用来判断是否存在目录
- -e 和!-e 用来判断是否存在文件或目录
- -x 和!-x 用来判断文件是否可执行
5.rewrite指令优先级
rewrite可配置区块:
rewrite一般配置在server全局区块,也经常搭配if条件区块来使用:
- server区块:配置在server区块的rewrite可以说是全局的,所有请求优先匹配该区块的rewrite指令。
- if区块:通过正则或条件匹配,将命中的请求进行重写,再去匹配接下去的location进行处理请求。配置在if区块的目的就是更好的让下面的location命中,然后去处理请求。
- location区块:可以配置在location区块,但没有多大意义,已经被location命中的请求一般直接进行处理了,再重写没意义。
rewrite指令优先级
- 执行server块的rewrite指令(这里的块指的是server关键字后{ }包围的区域,其它xx块类似)
- 执行if区块的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
- 如果其中某步uri被重写,则重新循环执行1-3,直到找到真实存在的文件
- 如果循环超过10次,则返回500 Internal Server Error错误
- 通过配置break来停止
注意:在location里面的rewrite指令,应使用break而不是last , 使用last将循环10次匹配,然后返回500错误。
二、if指令规则
不支持else,rewrite常搭配if条件语句来执行:
1.if指令语法
1 | # 语法: |
2.if指令条件
if条件(conditon)可以是如下任何内容:
1 | 1)一个变量名 false如果这个变量是空字符串或者以0开始的字符串; |
3.if指令实例
1 | if ($http_user_agent ~ MSIE) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 云运维!