参考:http://www.cnblogs.com/kevingrace/p/6398488.html
一、nginx rewrite规则
1.rewrite语法
- nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。
- 该模块需要PCRE支持,因此应在编译nginx时指定PCRE源码目录, nginx安装方法。
1 2 3 4 5 6 7 8 9 10
| rewrite regex replacement [flag] 关键字 正则表达式 替换值 标志位
例子: rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
解释: ^/(.*) 表示匹配所有 $1 取前面regex部分括号里的内容 permanent 永久301重定向,即跳转到后面的http://www.etiantian.org/$1地址上
|
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 3 4 5 6
| # 语法: if (condition) {...}
默认值:无 作用域:server,location 对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
|
2.if指令条件
if条件(conditon)可以是如下任何内容:
1 2 3 4 5 6 7
| 1)一个变量名 false如果这个变量是空字符串或者以0开始的字符串; 2)使用= != 比较的一个变量和字符串 3)是用~ ~* 与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围 4)使用-f !-f 检查一个文件是否存在 5)使用-d !-d 检查一个目录是否存在 6)使用-e !-e 检查一个文件、目录、符号链接是否存在 7)使用-x !-x 检查一个文件是否可执行
|
3.if指令实例
1 2 3 4 5 6
| if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($request_method = POST) { return 405; }
|