▌proxy_intercept_errors

当上游服务器响应头回来后,可以根据响应状态码的值进行拦截错误处理,与error_page 指令相互结合。用在访问上游服务器出现错误的情况下。

服务部署情况

一、主服务(nginx:80) , /usr/local/nginx/sbin/nginx

二、上游服务(nginx:8012), /usr/local/nginx_8012/nginx

上游服务器文件说明

404.html 和 404_default.html 内容:

04.html:上游服务器提供的特定404页面内容,当nginx:80访问上游服务器资源不存在(返回404),要求显示的内容页面。
404_default.html:上游服务器默认404页面。
50x.html:上游服务器提供的特定50x页面内容,当nginx:80访问上游服务器出现50x错误(包含500, 502, 503和504),要求显示的内容页面。
50x_default.html:上游服务器提供的处理50x的默认页面

注意:

404.html 和 50x.html 是给 nginx:80配置中使用的404_default.html 和 50x_default.html是给 nginx:8012配置中使用的

nginx:80服务中关于404和50x的配置

nginx:8012服务中关于404和50x的配置

几种配置

一、nginx:80服务的特定location配置

1). 开启proxy_intercept_errors
2). 设置特定的 error_page, 分别处理404和50x

配置如下

@404fallback 和 @50xfallback配置见

请求测试:

当通过nginx:80服务请求上游一个不存在的资源时,响应的结果如下:

结果进行说明:

1、由于上游服务器的配置

add_header Cache-Control max-age=5;
add_header Content-Encoding gzip;

所以响应头包含Cache-Control 和gzip头。

2、由于nginx:80配置,当出现404时,具体内容要从上游服务器获取。

@404fallback的配置

所以响应的内容为:

Upstream server provides a special page for representing 404.

二、上述配置不变,修改@404fallback中的资源名称

(由404.html修改为 404_not_exists.html)

这个资源在上游服务器文件列表中并不存在

在执行请求测试时,结果如下:

对结果进行说明:

1、由于请求的 nginx:8012服务器下的 /404_not_exists.html,该资源并不存在,所以没有匹配nginx:8012中的location / {xxx} 配置(见图1-3)。所以响应头没有再增加 Cache-Control 和 gzip。

2、走到了nginx:8012的404处理流程中,所以响应内容如下,是404_default.html的内容。

Upstream default 404 page.

三、测试error_page的不同位置

1). 关闭nginx:80 location中的error_page指令

2). 为nginx:80在server级别设置error_page指令,分别设置404和50x

测试结果与一、相同

注意没有测试修改@fallback内部的资源不存在的情况。后续再补充

四、关于error_page 的其他功能说明

1、修改error_page为:

执行测试结果为:

结果说明:
a、这种写法可以修改响应头的状态码。即可以将404或者其他5xx状态码修改为200。不填写默认值是200
b、注意:等号与@404fallback之间有一个空格
c、上述配置与将 error_page 修改为 error_page 404 =200 @404fallback; 效果一样

2、修改响应状态码为指定值。比如301,302等

测试结果:

总结

1、可以在特定location中将proxy_intercept_errors开启,来处理上游服务器的特定响应状态码。并获取自定义错误页面的内容,同时在不改变用户请求url的情况下,进行内容的展现。

2、可以结合error_page 来改变响应状态码。

结合nginx源码学习error_page和proxy 指令的关系相关推荐

  1. nginx源码学习资源

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  2. nginx 源码学习笔记(二)——nginx精粹-模块

    看了一点nginx的源码发现,nginx的模块思想确实吸引了我,也不得不佩服俄罗斯人的想问题方式,要分析nginx源码,首先要搞懂的就是nginx的模块思想以及相关的数据结构. 还记得我们上一次写的h ...

  3. 【Nginx 源码学习】内存池 及 优秀案例赏析:Nginx内存池设计

    文章目录 关于设计内存池之我的想法 内存池案例 malloc 底层原理 jemalloc && tcmalloc Nginx内存池设计 基础数据结构 源码分析 ngx_create_p ...

  4. nginx 源码学习笔记(二十一)—— event 模块(二) ——事件驱动核心ngx_process_events_and_timers

    首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数. 本篇文章来自于:http://blog.csdn.ne ...

  5. nginx源码学习----内存池详解

    最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然 ...

  6. nginx 源码学习笔记(十八)—— ngx_add_inherited_sockets 继承的sockets

    之前几节有讲过多进程的创建过程和子进程所处理的事情,今天要讲一下nginx里面main函数的另一个主要的操作ngx_add_inherited_sockets. ngx_add_inherited_s ...

  7. nginx 源码学习笔记(十)——基本容器——ngx_hash

    ngx_hash.{c|h}实现了nginx里面比较重要的一个hash结构,这个在模块配置解析里经常被用到.该hash结构是只读的,仅在初始创建时可以给出保存在其中的key-val对儿,然后就只能进行 ...

  8. nginx源码学习Unix - Unix域协议

    说到什么是域协议就会出现这么个解释: UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所使用的API相同.UNIX域协 ...

  9. 【Nginx 源码学习】Nginx 的缓冲区

    文章目录 缓冲区结构设计 缓冲区设计图 创建一个缓冲区 分配 chain 节点 分配一个 buf 链表 合并buf链表 从free chain链中获取一个空闲buf 回收链表空间 缓冲区结构设计 网络 ...

最新文章

  1. Github 移动端上架!把世界最大同性交友社区装进口袋
  2. Android软件开发之盘点自定义View界面大合集(二)
  3. Android UI之ImageButton(带图标的按钮)
  4. eclipse-连接TFS错误 the server to respond with a valid http response解决方法
  5. Linux 普通用户和超级用户的切换
  6. 周五下午3h直播丨2021第5期大咖讲坛:数据库安全与智能运维
  7. 理解insert all/insert first的使用
  8. 用Python操作PPT的办公自动化教程
  9. 经典案例悬臂梁受力有限元理论与程序设计_《数值计算与程序设计》系列课程之三
  10. python忽略错误继续执行_python能在错误出现之后再进行处理吗?
  11. asterisk sip服务器搭建与配置
  12. back_insert_iterator
  13. 向量相似度度量(二):EMD (Earth Mover's Distance)的MATLAB对照实现
  14. 计算Fisher信息之基础矩阵(一)
  15. python绘制五子棋棋盘_4.Python画一个五子棋棋盘
  16. 淘宝拆分关键词规定 淘宝关键词拆分优化方法
  17. 机器人布里茨说什么_英雄联盟布里茨台词有哪些
  18. 【Cancer Research】由Y染色体LINC00278编码的新型微肽与AR信号通路介导的男性食管鳞状细胞癌相关
  19. 计算机接口中的shl,西门子200的PLC中SHL和ROL的区别,还...-卓优商学问答
  20. NR SSB Beam Sweeping

热门文章

  1. x86软件如何在win32下使用_「译」JVM是如何使用那些你从未听过的x86魔幻指令实现String.compareTo的...
  2. 构造一条二次bezier曲线_那些处处连续,处处不可导的曲线
  3. 动画编辑器和骨骼动画使用
  4. php将汉字转换为拼音和得到词语首字母(一)
  5. Scala的sealed关键字
  6. python核心编程--笔记(不定时跟新)(转)
  7. html5 Canvas画图3:1像素线条模糊问题
  8. How to Use File Choosers
  9. asp.net服务器端对话框控件的简单实现(附源码)
  10. Flash Player Control for ASP.NET