参考: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条件区块来使用:

  1. server区块:配置在server区块的rewrite可以说是全局的,所有请求优先匹配该区块的rewrite指令。
  2. if区块:通过正则或条件匹配,将命中的请求进行重写,再去匹配接下去的location进行处理请求。配置在if区块的目的就是更好的让下面的location命中,然后去处理请求。
  3. location区块:可以配置在location区块,但没有多大意义,已经被location命中的请求一般直接进行处理了,再重写没意义。

rewrite指令优先级

  1. 执行server块的rewrite指令(这里的块指的是server关键字后{ }包围的区域,其它xx块类似)
  2. 执行if区块的rewrite指令
  3. 执行location匹配
  4. 执行选定的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;
}