openresty线上406 Not Acceptable实战排查

本文介绍了在使用openresty时遇到406 Not Acceptable错误的排查过程。错误源于客户端与服务器请求头协商不一致,特别是针对XML请求报文。通过在openresty的nginx配置中添加和修改请求头,解决了因平台方特殊需求导致的406问题,展示了openresty的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为公司需要对接平台业务,然后其中肯定离不开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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值