1. rewrite模块的return指令:
return指令 是由 rewrite模块
提供的 一个非常常用的指令,可以在 SERVER_REWRITE 和 REWRITE 这两个阶段生效,
它可以帮助我们做 重定向 和 一些简单的返回。
如果return指令生效了,则后面所有阶段的HTTP模块是没有机会得到执行的。
2. return指令的用法:
如图中所示,return指令 有三种用法:
return code [text];
return code URL;
return URL;
举例:
location / {
return 404 "find nothing!";
}
# return code [text];
server {
return 403;
}
# return code;
HTTP “30X” 状态码的含义:
HTTP 1.0 标准:
301
:http 1.0 永久重定向
例如客户端要访问网站A,Nginx返回301和网站B的URL重定向,则客户端会将这一次的重定向结果缓存起来,以后只要遇到要访问网站A的资源时,就自动重定向到网站B上,再也不会去访问网站A;
302
:临时重定向,禁止被缓存
例如客户端要访问网站A,Nginx返回302和网站B的URL重定向,那么这一次客户端会重定向的去访问网站B,
但是当下一次客户端又需要访问网站A的资源时,还是会去访问网站A的URL,客户端不会缓存Nginx返回的302指示的重定向结果;
HTTP 1.1 标准:
303
:临时重定向,允许改变方法,禁止被缓存
与302功能类似,区别在于允许改变方法,例如访问网站A时使用的是POST方法,在访问重定向后的网站B时可以变为GET方法;
307
:临时重定向,不允许改变方法,禁止被缓存
与302功能类似,区别在于不允许改变方法,即重定向前后的两次访问必须使用相同的方法,如果访问网站A的方法是GET,那么重定向后访问网站B也必须是GET方法;
308
:永久重定向,不允许改变方法
与301功能类似,区别在于不允许改变改变访问方法。
Nginx 自定义:
444
:立刻关闭连接,Nginx不会再给客户端返回任何东西。
3. return指令 与 error_page指令:
error_page指令 的功能是: 当我们收到一个返回码的时候,我们可以将其重定向为另外一个URI,也可以指定给用户返回不一样的内容,
例如收到404的时候,默认就是给用户返回404,但是某些网站为了给用户更好的体验,可能会返回图片,或者一些独立的页面,
例如:
error_page 404 /404.html;
#当收到404返回码时,给用户返回 /404.html 页面
一个例子说明return与error_page的关系:
- 当return与error_page同时出现,error_page还有被执行的机会吗?
- 当return同时出现在 server配置块 和 location配置块 下,两个return指令是否有 合并 关系?
第一个问题,如果return与error_page同时出现,则error_page是得不到执行的;
第二个问题,前面讲到过,return指令属于 “动作类指令”(另一种指令类型是 “值类指令”),动作类指令不能合并。
而在上面的例子中可以看到 return 403;
是出现在 server{} 配置块中,是属于 SERVER_REWRITE
阶段的;
而 return 404 "find nothing!";
是出现在 location{} 配置块中,是属于 REWRITE
阶段的,即 SEVER_REWITE 会在 REWRITE 阶段 前先执行,所以后面的return得不到执行,返回值是第一个return的值。
执行效果演示: