手记

《Nginx核心知识100讲》 rewrite阶段的rewrite模块:return指令、重新URL、if条件判断

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


0人推荐
随时随地看视频
慕课网APP