一、return指令
return指令是rewrite模块中的指令,而rewrite指令出现的地方有两个:一个是server rewrite,一个是location rewrite。
也就是说rewrite中的return指令可以出现再server模块中,也可以出现在location模块中,比如:
server {
return 301 'server';
location {
return 403 'location';
....
}
...
}
return会将请求的响应返回,所以后面所有的指令就不会被执行。
return指令的值有:
-
code [text]:如return 200 'test';
-
code URL:如return 302 x.threatbook.cn/;
-
URL: return x.threatbook.cn/;
二、相关状态码
-
444:立刻关闭链接,不会向用户返回响应。
-
301:永久性重定向。
-
302:临时重定向,禁止被缓存。
-
303:临时重定向,允许改变请求方法,禁止被缓存。
-
307:临时冲定向,不允许改变请求方法,禁止被缓存。
-
308:永久性冲定向,不允许改变请求方法。
三、return和error_page
error_page指令不是rewrite模块的指令,但是它和return指令很相似,这里我来做一个对比。
1、error_page指令
error_page指令的使用为:error_page code ...... [[=response]] uri;
2、使用案例
-
error_page 404 /404.html
-
error_page 400 =200 /404.html,这里=200的意思是虽然没有找到文件,但是返回给用户的状态码还是200
-
error_page 404 =@fallback,@fallback为一个location
-
error_page 404 x.threatbook.cn/
-
error_page 404 =200 x.threatbook.cn/
3、error_page的执行阶段
其实error_page没有执行阶段,它是集成到http框架中的指令,不属于任何阶段。
4、error_page与return指令的对比
情况1:
server {
error_page 404 /404.html;
return 200 '404'
}
直接返回return内容。
情况2:
server {
error_page 404 /404.html;
return 200 '404'
}
直接返回return内容。
情况3:
server {
error_page 404 /404.html; location /test/ {
return 200 'test';
}
}
直接返回return内容。
总结:接收请求时,不管error_page和return的位置如何变化,都返回return的内容。当上游服务器返回404、500等触发error_page时,会执行error_page。
四、rewrite指令
1、介绍
rewrite指令用于修改请求的url,它的用法为:rewrite regex replacement [falg]。regex为正则表达式,replacement为要要替换成的url,flag指示行为。
-
在该正则表达式中,可以使用(?)来匹配部分内容,使用$domain来获取匹配到内容。
-
当replacement为https://、http://、$schema开头的,直接返回302重定向。
-
flag可选的值:
-
--last:使用replacement重新匹配location。
-
--break:停止当前指令的执行,继续向下执行,break指令的作用相同,但是break指令在if中。
-
--redirect:返回302重定向。
-
--permanent:返回301重定向。
2、案例
-
server { location /first/ { rewrite /first(.*) /second$1 last; return 200 'first'; } location /second/ { rewrite /second(.*) /third$1 break; return 200 'second'; } location /third/ { return 200 'third'; }}
使用http://localhost/first/text.html,返回的内容为200 'secod'。
五、if指令
if指令能够让我们根据变量的值,判断是否执行某些操作。使用方法:
if (condition) {
......
}
表达式的条件为:
-
检查变量为空,或者值是否为0, 直接使用。
-
将变量和字符串做对比,使用=或者!=。
-
将变量和正则表达式做匹配。
-
大小写敏感,~或者!~。
-
大小写不敏感,~*或者!~*。
-
检查文件是否存在,使用-f或者!-f。
-
检查目录是否存在,使用-d或者!-d。
-
检查文件、目录、软连接是否存在,使用-e或者!-e。
-
检查是否为可执行文件,使用-x或者!-x。