请求头有问题导致Nginx返回400状态码
背景
上个星期有人找我看了Nginx的问题,场景是这样的,用户访问一个网址,这个网址有一个按钮,点击这个按钮后会跳转到新的页面,但这个跳转,有时候可以,有时候不可以——不可以的时候页面显示400状态码(开发反馈,同一个手机,不同浏览器,有的可以有的不可以;同一个手机,同一个浏览器,不同网络,有的可以,有的不可以)
问题排查
使用nginx日志排查问题
开发的手上有Nginx的access日志,通过查看返回400状态码的日志,我们发现日志显示进来的请求没有携带Host头的,而HTTP协议规定必须携带Host头,否则Nginx会直接抛出400 Bad Request。那么,问题的原因就是进来的请求没有携带Host头吗?并没有那么简单
分析抓包数据
一般来说,发出的请求不带Host是比较少见的,而且这个访问有时正常有时不正常,所以我们怀疑原因不是这个,要定位到问题原因,需要更多的数据进行分析。我们通常是在部署Nginx的Linux服务器上,使用tcpdump命令进行抓包,然后将抓到的包下载到本地的windows机器,使用wireshark工具进行分析。找到返回400状态码的Http流,查看请求头——(由于是在内网环境执行的操作,这些信息只能通过文字描述了),发现Host头是有的,并不像nginx的access日志所显示的没有Host头,那么为什么nginx没有识别到Host头呢?
原因分析
我们通过抓到的包,里面有正常请求和返回400的请求,经过比较,发现是其中一个请求头Refer不一样,并且返回400的请求的Refer在末尾携带了不可见字符(/000/000类似这样),我猜是因为这些字符,导致nginx对请求头都解析失败了,没有解析到Host头,于是就返回了400。
解决措施
联系相关的应用开发检查为什么会出现携带不可见字符的Refer并改正
总结
排查问题的时候,我们看到的原因可能不是根本原因,我们需要进一步获取原始数据、复现问题,经过对比和思考,定位根本原因并解决它
如果你对本文章有建议或疑问,欢迎在下面进行留言,一起交流
我是Vapire,一个普通的全栈开发。
以开发的角度看问题,用开发的方式学知识。
参考
鲜为人知的HTTP协议头字段详解大全 - 知乎 (zhihu.com)
Linux系统 tcpdump 抓包命令使用教程 - 知乎 (zhihu.com)
网络分析工具——WireShark的使用(超详细)_世间繁华梦一出的博客-CSDN博客_网络分析工具
请求头有问题导致Nginx返回400状态码相关推荐
- nginx返回400状态码
分析: 1.后端地址正常返回200: 2.确认是url加上参数后,nginx返回400,并且nginx除了400状态码的访问日志,没有输出其他异常日志: nginx地址: https://test.c ...
- axios发送post请求返回400状态码
axios发送post请求返回400状态码 今天在用 axios 发送一个跨域的post请求时,遇到了一个坑:Uncaught (in promise) Error: Request failed w ...
- get请求400错误 vue_解决axios发送post请求返回400状态码的问题
今天在用 发送一个跨域的post请求时,遇到了一个坑:uncaught (in promise) error: request failed with status code 400. 前台代码如下: ...
- 安全狗php站点404,开启安全狗响应内容保护导致404返回200状态码的解决办法
开启安全狗响应内容保护导致404返回200状态码的解决办法 2020-04-08 开启安全狗响应内容保护导致404状态码返回200的解决办法 今天无意中对www.tbadc.com的404错识做了一个 ...
- 理请求时出现未知错误.服务器返回的状态码为: 500,react-native
我试图调用一个api,但出现错误"未处理的承诺被拒绝:错误:请求失败,状态码为500". 我不知道如何得到错误.我将api调用放在componentDidMount中. 我不确定错 ...
- SpringBoot的GET请求参数包含[]等特殊符号,返回400状态码
今天系统2.1版本上线时,忽然发现一个问题,通知公告模块中的一个文件不能下载了,而其他的是可以的,经过仔细的排查发现,是由于文件名中包含了英文的[],问题如下图: 原因分析 Tomcat的新版本中增加 ...
- 接口请求返回400状态码,后端代码报错: java.lang.IllegalArgumentException: Invalid character found in the request targ
一. 错误原因: 当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误. 例如:http://localhost:8080/index.do?{id:123} 二. 解决办法 1 ...
- nginx php返回500错误,解决Nginx服务返回500状态码问题
文章目录 [隐藏] 发现问题 分析并解决问题 最近鼓捣博客服务器,不经意间误操作改了一些目录的用户组及权限,导致博客文件上传功能失败,周末检查了一天依然没有解决问题,在不经意间意识到了问题所在,其实有 ...
- scrapy 爬虫报415状态码和400状态码
今天用Scrapy框架时出现了一些小问题,折腾了半天,记录一下. 返回415状态码:请求包未加header 请求包 这是一个POST请求并需要提交表单数据,所以我用了scrapy.FormReques ...
最新文章
- Python for虚幻引擎编辑器工具脚本学习教程
- mysql 分组排序_Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱
- 苹果出了新手机,我却盯上了他的手机壳
- nfc pm3 模拟加密门禁卡_华为手机NFC的妙用,模拟门禁卡、公交卡、银行卡,电子证件等...
- 阿里Druid数据库连接池配置解释
- VS2019 C#安装那些插件_【完整版】针对零基础小白的VS2019安装攻略
- 记一次解决 quill(vue-quill-editor) 编辑器中莫名多出一行“pbr/p”的过程...
- 用python修改文件内容修改txt内容的3种方法
- 为什么要进行字节对齐?
- Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)
- 2014年英语一作文partB漫画作文
- eclipse中自定义videoview类_android控件之VideoView建立自己的播放器
- linux ora 00911,python – DatabaseError:ORA-00911:无效字符
- js图片 area 颜色_JS提取图片的主体颜色
- android webview 例子,android – webview shouldinterceptrequest示例
- 设计模式 代理模式(Proxy Pattern)
- 软件架构设计-软件架构风格、分层架构
- rufus中gpt和mrb磁盘_SSD固态硬盘用GPT还是MBR分区?
- Adobe(R) Flash(R) Player 安装失败.有关故障排除的提示,请访问 httpwww.adobe.comgotn_19166_cn
- 看风云变幻,自云淡风轻