openresty线上406 Not Acceptable实战排查

article/2025/10/4 4:51:51

因为公司需要对接平台业务,然后其中肯定离不开nginx来做代理转发的,而且我们没有http的地址,全是对外暴露的https的地址。今天就遇到了一些问题,在对接平台的时候它们调过来经过nginx总是406报错,今天我就带大家一起揭秘nginx遇到请求错误406的排查思路!


首先,要知道406错误码是怎么造成的,这是一个重点,一定要拿起小本本记住!
在这里插入图片描述
知道406错误码的前提给你们看看postman测试时406的样子!

postman错误码406
在这里插入图片描述

响应状态码406是HTTP协议状态码的一种(4xx表示客户端的问题),表示客户端无法解析服务端返回的内容。简单来说就是请求端发起请求接收端解析不了!

发起一个请求需要有请求头,如果有请求报文的话还得指定请求头的媒体类型(ContentType)。所以要求请求端和接收端双方主动协商头字段,也就是请求头。请求段需要设置请求报文类型的请求头,接收端也得设置,只有主要协商达成一致,请求才能被成功处理并响应结果!

以下就是我在公司排查的案例!

因为公司对接的这一个平台比较奇葩,请求报文是xml格式,其实我听到的时候也是惊呆了。随后我了解了一下,确实有对接平台用xml请求报文的例子。

同事测试着了好半天,发现平台那边在调用的时候加了一个请求头(Accept),如下:

请求头
在这里插入图片描述

Accept请求头这样设置,接收请求优先接收application/xml请求头,其次接收text/xml请求头格式的请求,如果没有就产生406!

于是问题就来了,在不加Accept请求头之前调用是正常调用能通过nginx进行代理转发的,但是加了Accept响应头之后就出现406根本调不通!开始发现响应头却响应了一个text/html,我请求头text/xml,你却响应text/html,这显然处理不了产生406!

于是在openresty的nginx的location模块内加了这样一行配置,指定的响应头

# openstry专属设置响应头的方式,后面详细讲
# 注意:一定要写在proxy_pass代理转发之后才生效,因为是响应嘛,你细品!
more_set_headers "Content-Type:application/xml;charset=utf-8";

指定了响应头后,响应结果就变成了如下图的样子:

响应头
在这里插入图片描述

但是奇怪的事情发生了,请求报文xml格式没有问题,请求头和响应头都没有问题,响应结果依然不变还是406呢?

这件事情苦恼了很久,最后结果却是对接平台那边的问题,因为它们在解决这个问题的时候需要动后端代码设置请求头,而且会影响其他服务,只能另辟蹊径。于是,找到了一个办法,就是可以在openresty接收到请求之后把请求头全部清除掉,然后自己设置代理转发后的请求头,这样就可以完美的解决这个问题!

随后就添加了如下配置,将罪魁祸首Accept请求头清除掉,如下:

# 注意:一定要在proxy_pass代理转发之前清楚请求头
more_clear_input_headers 'Accept';

最后location模块的配置如下图:

openresty中location模块配置
在这里插入图片描述

知识分享

以上排查解决的思路和方法,你会发现more_set_headersmore_clear_input_headers这两个很相似,而且前缀都是一样的,还有没有其他配置呢?答案是有!

注意: nginx的headers_more模块用于 添加、修改或清除 请求/响应头,nginx默认不包含该模块,需要安装openresty后才能使用!!!(个人理解:这只是强大的openresty的冰山一角罢了,也是为什么这么多厂商使用的原因!)

openresty配置项描述
more_set_headers用于 添加、修改、清除 响应头
more_clear_headers用于 清除 响应头
more_set_input_headers用于 添加、修改、清除 请求头
more_clear_input_headers用于 清除 请求头

有了这些配置项,你可以灵活的控制请求头和响应头,比如下面的例子,自定义响应头:

# 清除 X-Powered-By 响应头
# 增加 X-Author 响应头为hezp
# 修改原为text/xml的 Content-Type 响应头为application/json
more_clear_headers X-Powered-By;
more_set_headers "X-Author: hezp" "Content-Type: application/json";

如果你喜欢我的文章,对你还算是有所收获的话,请点赞、评论、收藏,你对我的支持将是我最大的动力!Thank You!


http://chatgpt.dhexx.cn/article/7Wv12ZKM.shtml

相关文章

html报406错误,Ajax请求出现406的原因和解决方法

一般出现406错误有两种可能: 1、如果后缀是html是不能响应json数据的。需要修改后缀名。 在做伪静态化过程中,以.html结尾的后缀,做post请求时,不能响应json格式,这是spring官方做出的处理 可以加一个后缀改为.action …

SpringMVC在返回JSON数据时出现406错误解决方案

在SpringMVC框架的使用中常常会使用ResponseBody注解,修饰“处理器”(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回的对象转成JSON字符串响应给客户端,但这种操作有时…

Spring MVC 406

使用Spring MVC返回 JSON 数据有时候会在页面报出以下 406 错误。具体错误信息如下: 最常见的问题就是缺少 Jackson 工具包,它的作用是把 Java 对象转换成 JSON 输入出页面。当然这是最常见的情况,下面我就来介绍一下项目中出现的问题。由于项…

Sense 406错误

原来Sense 0.9.0 版本不能支持elasticsearch6.x 参考{https://blog.csdn.net/xieshanwu/article/details/78667881} 使用Chrome浏览器插件sense请求时,报错406 查询官方文档得到说明,从6.0版本开始,本次请求必须加上正确的 Content-Type&am…

406

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ()。 出现的解决办法 有可能是调用的方法中requestMapper中写的produces" text/xml;chars…

406什么错误ajax,ajax406错误

如上,ajax请求时一直返回error,但是后台已经正确返回。网上给出的解决办法是spring3.*的,但我的是sppring 4.*的,应该不适用,我也没试。 思索一下,406 not acceptable,直译过来是不接受,不接受什么呢?后台既然已经返回,前台不接受 是不是和数据格式有关? 但前台要求的…

Http状态码406(Not Acceptable) 错误问题解决方法

状态码406:HTTP协议状态码的一种(4xx表示客户端的问题),表示客户端无法解析服务端返回的内容。说白了就是后台的返回结果前台无法解析就报406错误。 示例代码中请求代码,后台代码均正常,且有返回信息。如下…

简单垃圾邮件过滤系统

头文件&#xff1a; typedef struct chuan1 {char* str;int chang;int maxchang;}chuan; int chushi(chuan* s, int max, char* d) //动态数组方法 {if (max < strlen(d)){printf("初始化错误&#xff0c;MAX太小\n");return 0;}s->str (char*)malloc(sizeo…

【机器学习】朴素贝叶斯实现垃圾邮件过滤

朴素贝叶斯法概述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff08;朴素贝叶斯法这种通过学习得到模型的机制&#xff0c;显然属于生成模型&#xff09;&#xff1b…

python:基于朴素贝叶斯算法的垃圾邮件过滤分类

目录 一、朴素贝叶斯算法 1.概述 2.推导过程 二、实现垃圾邮件过滤分类 1.垃圾邮件问题背景 2.朴素贝叶斯算法实现垃圾邮件分类的步骤 3.python实现 参考学习网址&#xff1a;https://blog.csdn.net/weixin_59450364/article/details/124343350 一、朴素贝叶斯算法 1.…

机器学习:朴素贝叶斯的应用之垃圾邮件过滤

机器学习&#xff1a;朴素贝叶斯的应用之垃圾邮件过滤 文章目录 机器学习&#xff1a;朴素贝叶斯的应用之垃圾邮件过滤1.相关概念1.条件概率&#xff1a;2.贝叶斯公式&#xff1a;3.拉普拉斯平滑&#xff1a; 2.朴素贝叶斯分类器1.根据已知数据计算先验概率以及条件概率2.根据M…

【机器学习】贝叶斯算法详解 + 公式推导 + 垃圾邮件过滤实战 + Python代码实现

文章目录 一、贝叶斯简介二、贝叶斯公式推导三、拼写纠正案例四、垃圾邮件过滤案例4.1 问题描述4.2 朴素贝叶斯引入 五、基于朴素贝叶斯的垃圾邮件过滤实战5.1 导入相关库5.2 邮件数据读取5.3 构建语料表&#xff08;字典&#xff09;5.4 构建训练集的特征向量5.5 朴素贝叶斯算…

实现垃圾邮件过滤(Python3实现)

实验代码&#xff1a; import os import re import string import mathDATA_DIR enron target_names [ham, spam]def get_data(DATA_DIR):subfolders [enron%d % i for i in range(1, 7)]data []target []for subfolder in subfolders:# spamspam_files os.listdir(os.pa…

机器学习之朴素贝叶斯实现垃圾邮件过滤

一.朴素贝叶斯概述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff08;朴素贝叶斯法这种通过学习得到模型的机制&#xff0c;显然属于生成模型&#xff09;&#xff…

基于逻辑回归方法完成垃圾邮件过滤任务

一、基于逻辑回归方法完成垃圾邮件过滤任务 1、✌ 任务描述 我们日常学习以及工作中会收到非常多的邮件&#xff0c;除了与学习工作相关的邮件&#xff0c;还会收到许多垃圾邮件&#xff0c;包括广告邮件、欺诈邮件等等。本任务通过邮件中包含的文本内容来判断该邮件是正常邮…

【机器学习实战】朴素贝叶斯应用之垃圾邮件过滤

1.什么是朴素贝叶斯2.贝叶斯公式3.朴素贝叶斯常用的三个模型4.朴素贝叶斯实现垃圾邮件过滤的步骤5.垃圾邮件过滤实验&#xff1a;&#xff08;一&#xff09;、准备收集好的数据集&#xff0c;并下载到本地文件夹&#xff08;二&#xff09;、朴素贝叶斯分类器训练函数&#xf…

贝叶斯垃圾邮件过滤

贝叶斯垃圾邮件过滤 译自From Wikipedia, the free encyclopedia 贝叶斯垃圾邮件过滤是一种筛选电子邮件的统计技术。在它的基本形式中&#xff0c;它使用天真贝叶斯分类器在词特征包上识别垃圾电子邮件&#xff0c;这是一种在文本分类中常用的方法。 天真贝叶斯分类器通过使用…

【布隆过滤器】如何防止缓存穿透、海量邮箱的垃圾邮件过滤等问题?

目录 一、布隆过滤器是什么&#xff1f; 二、布隆过滤器的模拟实现 2.1、模拟实现 2.2、布隆过滤器的优点和缺点 优点&#xff1a; 缺点&#xff1a; 2.3、布隆过滤器的删除功能 2.4、布隆过滤器的使用场景 一、布隆过滤器是什么&#xff1f; 它是一种概率型数据结构&am…

垃圾邮件过滤挑战

垃圾邮件过滤挑战 随着网络应用的逐渐发展&#xff0c;电子邮件成为人们日常工作生活中不可分割的一部分。与此同时&#xff0c;垃圾邮件的问题困扰着许多电子邮件的使用者&#xff0c;它们不仅为电子邮件的使用者带来阅读负担&#xff0c;更占用了有限的邮箱空间。为此本研究…

基于C#的机器学习--垃圾邮件过滤

在这一章&#xff0c;我们将建立一个垃圾邮件过滤分类模型。我们将使用一个包含垃圾邮件和非垃圾邮件的原始电子邮件数据集&#xff0c;并使用它来训练我们的ML模型。我们将开始遵循上一章讨论的开发ML模型的步骤。这将帮助我们理解工作流程。 在本章中&#xff0c;我们将讨论以…