相关指令有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;
}
原文:http://nanchunle.blog.51cto.com/9244770/1836238