51 | rewrite阶段的rewrite模块:return指令
image.png
http rewrite 模块提供的return 指令。return 指令在哪里生效呢?在find_config之前的rewrite阶段,以及find_config之后的那个rewrite阶段。return指令生效以后,其实所有其他阶段的http模块是没有机会执行的。nginx conf中的指令要注意到,不管下面配什么样的proxy pass都是得不到执行的。
return 语法
image.png
302:我们最常使用的。告诉浏览器你应该怎样处理返回的location。本来访问网站A我们给了B,然后它访问B。下次再访问A还会给B。但是301就不一样了,会记录到缓存中,下次访问A,实际上直接访问的B。
HTTP1.1中的303、307、308跟HTTP1.0中的区别在于是否允许改变请求方法。
这些状态码中,大部分是返回给客户端的,浏览器可以收到这个Code,但是有一个code收不到,那就是444。立刻关闭连接,不在向用户返回内容。
error_page
image.png
error page的用法: 收到某一个返回码的时候,可以重定向为另一个URL,也可以指定给用户返回不一样的内容。比如:收到404返回码,如果是默认的话是404,为了给用户体验好点,可能返回一个图片或者页面。这些页面提示比较友好。
image.png
当我们出现了return的时候,error page的 404还会执行吗?当return这个指令同时出现在server块下跟location块下,还有合并的关系吗?之前介绍return 是动作类指令是没有合并关系的。
实例
image.png
image.png
image.png
从刚介绍的11个阶段可以看出来,server阶段的return 先于location阶段的return执行,一定是返回405的。
image.png
课后留言
1.由proxy_pass指定的后段服务器返回的404 500等状态会触发return和error_page的执行吗?你在示例中使用了root指令来说明
作者回复
不会触发return,可以应用在error_page上
52 | rewrite阶段的rewrite模块:重写URL
rewrite 指令
image.png
什么是脚本指令呢?实际上rewrite模块提供的所有指令都是脚本指令。
image.png
实际演练
image.png
image.png
为什么得到是second呢。rewrite后面没有跟break。然后,这两个指令(rewrite跟return)形成脚本指令的set形成一个集合,依次向下执行。如果加上break呢?
image.png
image.png
为什么返回的是text3
呢。因为加了break 停止了。后面的return 也被停止了。开始找对应的html/third/3.text的文件。
image.png
image.png
image.png
image.png
image.png
image.png
rewrite_log 默认是不开。如果打开之后。都会在指定的error log中出现。
image.png
留言问题
1.按照你的操作步骤,可以生成notice_error.log文件,但rewrite执行生效了,但在log中看不到日志记录。请问为啥呢?
作者回复
1、rewrite_log确保打开;2、确保error.log的日志级别允许打印rewrite日志,比如设成info。
2.我访问静态资源时,优先访问本地资源,如果404 就访问到文件存储服务器,但是现在页面存在跨域的问题,能不能在nginx实现不跨域请求呢。
作者回复
try_files就可以哦,第1个参数配置本地资源路径,第2个参数用@内部重定向,到另一个proxy_pass反向代理中
3.rewrite和proxy_pass的区别在哪里呢?有一些别的Http服务器(比如IIS),就是利用rewrite实现反向代理的。不都是把请求写给另外一个地址吗?
作者回复
1、关于重写URL。proxy_pass的重写URL能力非常弱,而且依赖location后的URL。rewrite可以重写任意URL。
2、关于反向代理。rewrite没有反向代理功能。第4部分有关于反向代理流程和原理的介绍。
53 | rewrite阶段的rewrite模块:条件判断
if 指令
这个指令使我们根据请求中的变量的值,判断变量的值是否满足某一个条件以后,再执行if块下面的配置指令,根据这些指令再调用相应的模块处理请求。
image.png
if也是脚本指令,所有脚本类指令遵循的规则,它也遵循。
image.png
示例
image.png
留言问题
1.很期待老师讲解if的坑,我一直没太理解它的成因,只是简单记住在if里只有rewrite的模块指令是安全的
作者:言十年
链接:https://www.jianshu.com/p/f45fb2eba8cd