记一次请求接口出现400响应码的诡异错误实录

news2024/11/16 7:37:02

前言

最近业务碰到了一个诡异的400接口请求异常,部门用户通过浏览器访问会出现400响应码错误,部分用户又能正常访问。该接口用postman请求访问,都能正常返回数据。后端写客户端请求该接口,也都能返回正常的数据。本文就来记录一下这次问题

整体简化版请求链路

如图

问题排查过程

因为不管是用postman或者是后端自己写客户端请求,都能返回正常的数据。就说明我们请求的参数是没啥问题,问题可能是出现在请求头上,我们就觉得是不是nginx做了啥限制,于是 官网溜一圈,发现如图的参数


它的中文大意是通常客户端请求缓存的大小1K就够了,但是如果请求包含长cookie或者wap客户端,1k这个值可能就不大够,因此我们适当把该大小调高验证,发现没效果。于是我们把目光转向,client_header_buffer_size下方的large_client_header_buffers


该参数的大体作用:设置用于读取大型客户端请求标头的缓冲区的最大数量和大小。请求行如果超过一个缓冲区的大小,就会向客户端返回414(请求URI太大)错误。请求头字段也不能超过一个缓冲区的大小,否则会向客户端返回400(错误请求)错误。缓冲区仅按需分配。默认情况下,缓冲区大小等于8K字节。如果在请求处理结束后,连接转换为保持活动状态,则释放这些缓冲区。

看到这里我们似乎看到曙光,因此我们果断把该参数加上,并调高相应的配置值,本以为可以高枕无忧,结果配上去,那偌大的400错误,感觉就是在嘲讽我们的天真。

思路似乎断了,就问了一下chatGPT,看它有没有什么想法,可能是我提示不够精确,在它一本正经的胡说八道后,我放弃继续追问。于是还是走回传统的提问方式,去搜索引擎排查一番,然后查到这篇文章
https://www.likecs.com/ask-3802541.html

这篇文章告诉我们当我们做了刚才配置后,还会出现400,此时跟我们的nginx大概没啥关系了,应该是跟后端有关系,他建议是如果是springboot项目,通过在项目中适当调高如下的值

server:
  max-http-header-size:

于是我们死马当活马医,神奇的事发生了,没有再出现400的情况

问题原因梳理

出现请求400的原因,确实是请求头过大的原因,但为什么通过postman或者后端请求就不会有问题,而通过浏览器访问就会有问题,原因就是我们在处理跨域的时候,请求头加了一堆乱七八糟的东西,比如

        add_header 'Access-Control-Allow-Headers' 'x-app-id,x-tenant-id,x-user-id,Authorization,Accept,Origin,Keep-Alive,User-Agent,access-control-allow-origin,If-Modified-Since,Cache-Control,Content-Type,Range,systemId,Cookie。。。';

其次为什么会出现部分用户访问出现400,部分用户又不会,就是因为我们请求时,请求头会携带用户jwt token,该token的payload存放一堆跟用户相关的东西,比如权限id列表啥的,这样就导致有些用户的token的长度是比较大

总结

此次400响应码错误的问题,除了技术层面上,还有一些是规范上的,比如请求头加了了一堆无用的参数,其次为了方便,在token上搞了一堆业务数据,有些bug真的是无意识产生的,轻描淡写的一篇文章,可知道当时排查了2,3天,希望这篇文章能给其他小伙伴带来一些帮助或者排查思路吧

附录

nginx-ingress配置header头缓冲大小

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |-
      underscores_in_headers on;
      large_client_header_buffers 4 1M;
      client_header_buffer_size 16K;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世微 舞台灯深度调光 大功率 dc-dc降压恒流驱动IC APS54083

产品描述 APS54083 是一款 PWM 工作模式,高效率、外围简单、外置功率 MOS 管,适用于 5-220V 输入高精度降压 LED 恒流驱动芯片。输出最大功率150W最大电流 6A。APS54083 可实现线性调光和 PWM 调光,线性调光脚有效电压范围 0.5-2.5V.PWM 调光频率范围 10…

《工业和信息化领域数据安全行政处罚裁量指引(试行)》意见征求

11月23日,工业和信息化部网络安全管理局发布了《工业和信息化领域数据安全行政处罚裁量指引(试行)》,并且面向社会公开征求意见。 据悉,《工业和信息化领域数据安全行政处罚裁量指引(试行)》的推…

【挑战业余一周拿证】二、在云中计算 - 第 3 节 - Amazon EC2 定价

目录 第 3 节 - Amazon EC2 定价 一、按需 适用场景 二、Savings Plans 适用场景 三、预留实例 三种付款模式 四、Spot 实例 适用场景 五、专用主机 适用场景 关注订阅号 首页:【挑战业余一周拿证】AWS 认证云从业者 - 基础 课程目录:【挑…

玻色量子企业荣誉

2023年 2023.7 玻色量子创始人&COO马寅荣获“优秀共产党员”荣誉称号 2023.4 斩获“双金”!玻色量子在中国移动第七届创客马拉松大赛脱颖而出 2023.1 再创佳绩!玻色量子荣膺2022年德勤中国“朝阳明日之星” 2023.1 玻色量子荣为第二届朝阳区“…

SpringCloudAlibaba之Nacos的持久化和高可用——详细讲解

目录 一、Nacos持久化 1.持久化说明 2.安装mysql数据库5.6.5以上版本(略) 3.修改配置文件 二、nacos高可用 1.集群说明 2.nacos集群架构图 2.集群搭建注意事项 3.集群规划 4.搭建nacos集群 5.安装Nginx 6.配置nginx conf配置文件 7.启动nginx进行测试即可 一、Nacos持久…

JAVAEE初阶 多线程基础(四)

join的知识补充,线程的状态和线程安全 一.多线程完成运算操作二.多线程代码的变换2.1 转换成串行执行 三.join的参数四.获取线程的引用4.1用this方法获取实例4.2 用currentThread获取实例 五.线程的状态六.线程安全 一.多线程完成运算操作 可以发现,多线程并行比单线程的速度快…

操作系统安全实验一Linux系统的基本操作

一、实验要求 二、实验步骤 (1)Linux命令格式Linux系统中bash命令的一般格式是 :命令名[选项][处理对象]例:ls -la mydir 三、目录操作 ls指令 ls指令 ls指令 cd指令 pwd指令 四、文件操作 cat指令 cat指令 rm指令 cp指令 mv指令 五、系统权限设置 who指令 chmod指令 groups指…

c++ opencv使用drawKeypoints、line实现特征点的连线显示

前言 图像经过算子处理后得到若干特征点,使用opencv进行渲染显示出这些特征点并且连线,更直观的对比处理前后的一些差异性 demo核心代码 //画出特征点并连线 void drawFilterLinePoints(cv::Mat& srcMat, cv::Point2f pointStart, cv::Point2f po…

多模态大模型总结2

LLaVA-V1(2023/04) 论文:Visual Instruction Tuning 网络结构 如下图 所示为 LLaVA-v1 的模型结构,可以看出其简化了很多,但整体来说还是由三个组件构成: Vision Encoder:和 Flamingo 模型的 V…

TS版LangChain实战:基于文档的增强检索(RAG) | 京东云技术团队

LangChain LangChain是一个以 LLM (大语言模型)模型为核心的开发框架,LangChain的主要特性: 可以连接多种数据源,比如网页链接、本地PDF文件、向量数据库等允许语言模型与其环境交互封装了Model I/O(输入…

操作系统CLOCK算法

操作系统时钟(CLOCK)置换算法_时钟置换算法-CSDN博客 前七步相同 第八步的时候 发现页面在内存中 标记位变成1 但是指针不需要移动。

虚幻学习笔记3—UI跟随弹窗

一、前言 本文使用的虚幻引擎5.3.2,继点击场景3D物体的两种处理方式的基础完成对3D物体的点击触发后,我们需要制作一个可以弹窗显示该物体信息的UI面板,同时保证弹窗可以跟随物体。另外还讲了一种UI上的悬浮提示跟随弹窗。 二、实现 2.1、创…

【python】python基础速通系列2-python程序中的积木块

【组成Python的几个单位】 变量:指向值的名称。或者说变量是一个名称,这个名称指向一个具体的指。比如n=17,就说这个叫做n的变量的值是17。表达式:是值,变量和运算符的组合。如果把变量理解为名词,那么表达式就是把名词连起来的动词形容词。比如:n+25。语句:代码的基本…

Java后端开发——JDBC(万字详解)

Java后端开发——JDBC(万字详解) 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1,JDBC概述 在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 …

深度视觉目标跟踪进展综述

1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) ,在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法,采用的框架包括相关滤波器、分类式网络、双路网络等。 处理跟踪任务的角度,分为基于匹配思路的双路网…

Vue3的项目创建到启动

Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功

MySQL修改已存在数据的字符集

在实际应用中,如果一开始没有正确的设置字符集,在运行一段时间以后,才发现当前字符集不能满足要求,需要进行调整,但又不想丢弃这段时间的数据,这个时候就需要修改字符集。 在MySQL设置默认字符集和校对规则…

HCIE 01:基于前缀列表的BGP ORF功能

当运行BGP协议的某台设备上,针对入方向配置了基于ip-prefix的路由过滤,过滤了邻居发送的路由; 目前想,通过在peer关系的两端设备上都配置ORF功能,实现路由发送端只能送路由接收端过滤后的路由; ORF功能的说…

Django回顾2

目录 一.HTTP 1.URL介绍 2.格式: 3.补充: 二.web框架 1.什么是框架 2.什么是web框架 3.wsgi协议 基于wsgi协议的web服务器: 4.协议是怎么规定的 三.Django 1.MVC与MTV模型(所有框架其实都遵循MVC架构) 2.…

Milvus入门手册1.0

一、window环境搭建(单机) 1、docker安装 略 2、milvus安装 参考文档:https://milvus.io/docs/install_standalone-docker.md tips: (1)compose.yaml下载比较慢,可以在网络上找一份。 (2&…