相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。

1.if指令

语法: if(confition){...}

默认值:none

使用环境:server,location

该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。if指令不支持嵌套,不支持多个条件&&和||处理。

以下信息可以被指定为条件

(1)变量名,错误的值包括:空字符串“”,或者任何以0开始的字符串

(2)变量比较可以使用“=”(表示等于)和“!=”(表示不等于)运算符

(3)正则表达式模式匹配可以使用“~*”和“~”符号

(4)“~”符号表示区分大小写字母的匹配

(5)“~*”符号表示不区分大小写字母的匹配(例如firefox和FireFox是匹配的)

(6)“!~”和“!~*”符号的作用刚好和“~”、“~*”相反,表示不匹配

(7)“-f”和“!-f”用来判断文件是否存在

(8)“-d”和“!-d”用来判断目录是否存在

(9)“-e”和“!-e”用来判断文件或目录是否存在

(10)“-x”和“!-x”用来判断文件是否可执行

部分正则表达式可以在圆括号“()”内,其值可以通过后面的变量$1至$9访问

2.rewrite指令

rewrite 指令

语法:rewrite regex replacement flag

默认值:none

使用环境:server,location,if

该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。

注意重写表达式只对相对路径有效。如果你想配对主机名,应该使用if语句,代码如下:

if ($host ~* www\.(.*)){

    set $host_without_www $1

    rewrite ^(.*)$ http://$host_without_www$1 permanent; #$1 contains 

    '/foo',not 'www.mydomain.com/foo'

}

如果替换串以http://开头,将会采用301或302跳转进行URL重定向。

rewrite指令的最后一项参数为flag标记,支持的flag标记有:

last-----相当于Apache里的[L]标记,表示完成rewrite

break----本条规则匹配完成后,中值匹配,不在匹配后面的规则

last:rewrite匹配后,会再次发起一个请求,只会对location里的规则再次匹配。

break:rewrite匹配后,不会发起请求,也不会匹配后面的规则。

redirect--返回302临时重定向,浏览器地址栏会显示跳转后的URL地址。

permanent-返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

在以上标记中,last和break用来实现URI重写,浏览器地址栏的URL地址不变,但在服务器端

访问的路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。

last和break标记的实现功能类似,但二者之间有细微查边,使用alias指令时必须用last标记,

使用proxy_pass指令时要使用break标记。last标记则在本条规则匹配完成后会对其所在的

server{...}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。例如下面这段规则,必须使用break标记,使用last标记会导致死循环。

location /cms/ {

    proxy_pass http://test.youdomain.com;

    rewrite "^/cms/(.*)\.html$" /cms/index.html break;

}

3.set指令

set 指令

语法:set variable value

默认值:none

使用环境:server,location,if

该指令用于定义一个变量,并给变量赋值,变量的值可以为文本变量及变量文本的联合

set $varname 'hello';

4.return指令

语法:return code

默认值:none

使用环境:server,location,if

该指令用于结束规则的执行并返回状态吗给客户端。状态码可以是:204,400,402-406,408,410,411,413,416及500~504。此外,非标准状态码444将以不发送任何Header头的方式结束连接。

示例,如果访问的URL以.sh和.bash结尾,则返回状态吗403

location ~ .*\.(sh|bash)?$

{

return 403;

}

5.break指令

语法:break

默认值:none

使用环境:server,location,if

该指令的作用是完成当前的规则集,不再处理rewrite指令。

示例:

if ($slow){

    limit_rate 10k;

    break;

}