背景

上个星期有人找我看了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状态码相关推荐

  1. nginx返回400状态码

    分析: 1.后端地址正常返回200: 2.确认是url加上参数后,nginx返回400,并且nginx除了400状态码的访问日志,没有输出其他异常日志: nginx地址: https://test.c ...

  2. axios发送post请求返回400状态码

    axios发送post请求返回400状态码 今天在用 axios 发送一个跨域的post请求时,遇到了一个坑:Uncaught (in promise) Error: Request failed w ...

  3. get请求400错误 vue_解决axios发送post请求返回400状态码的问题

    今天在用 发送一个跨域的post请求时,遇到了一个坑:uncaught (in promise) error: request failed with status code 400. 前台代码如下: ...

  4. 安全狗php站点404,开启安全狗响应内容保护导致404返回200状态码的解决办法

    开启安全狗响应内容保护导致404返回200状态码的解决办法 2020-04-08 开启安全狗响应内容保护导致404状态码返回200的解决办法 今天无意中对www.tbadc.com的404错识做了一个 ...

  5. 理请求时出现未知错误.服务器返回的状态码为: 500,react-native

    我试图调用一个api,但出现错误"未处理的承诺被拒绝:错误:请求失败,状态码为500". 我不知道如何得到错误.我将api调用放在componentDidMount中. 我不确定错 ...

  6. SpringBoot的GET请求参数包含[]等特殊符号,返回400状态码

    今天系统2.1版本上线时,忽然发现一个问题,通知公告模块中的一个文件不能下载了,而其他的是可以的,经过仔细的排查发现,是由于文件名中包含了英文的[],问题如下图: 原因分析 Tomcat的新版本中增加 ...

  7. 接口请求返回400状态码,后端代码报错: java.lang.IllegalArgumentException: Invalid character found in the request targ

    一. 错误原因: 当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误. 例如:http://localhost:8080/index.do?{id:123} 二. 解决办法 1 ...

  8. nginx php返回500错误,解决Nginx服务返回500状态码问题

    文章目录 [隐藏] 发现问题 分析并解决问题 最近鼓捣博客服务器,不经意间误操作改了一些目录的用户组及权限,导致博客文件上传功能失败,周末检查了一天依然没有解决问题,在不经意间意识到了问题所在,其实有 ...

  9. scrapy 爬虫报415状态码和400状态码

    今天用Scrapy框架时出现了一些小问题,折腾了半天,记录一下. 返回415状态码:请求包未加header 请求包 这是一个POST请求并需要提交表单数据,所以我用了scrapy.FormReques ...

最新文章

  1. Python for虚幻引擎编辑器工具脚本学习教程
  2. mysql 分组排序_Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱
  3. 苹果出了新手机,我却盯上了他的手机壳
  4. nfc pm3 模拟加密门禁卡_华为手机NFC的妙用,模拟门禁卡、公交卡、银行卡,电子证件等...
  5. 阿里Druid数据库连接池配置解释
  6. VS2019 C#安装那些插件_【完整版】针对零基础小白的VS2019安装攻略
  7. 记一次解决 quill(vue-quill-editor) 编辑器中莫名多出一行“pbr/p”的过程...
  8. 用python修改文件内容修改txt内容的3种方法
  9. 为什么要进行字节对齐?
  10. Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)
  11. 2014年英语一作文partB漫画作文
  12. eclipse中自定义videoview类_android控件之VideoView建立自己的播放器
  13. linux ora 00911,python – DatabaseError:ORA-00911:无效字符
  14. js图片 area 颜色_JS提取图片的主体颜色
  15. android webview 例子,android – webview shouldinterceptrequest示例
  16. 设计模式 代理模式(Proxy Pattern)
  17. 软件架构设计-软件架构风格、分层架构
  18. rufus中gpt和mrb磁盘_SSD固态硬盘用GPT还是MBR分区?
  19. Adobe(R) Flash(R) Player 安装失败.有关故障排除的提示,请访问 httpwww.adobe.comgotn_19166_cn
  20. 看风云变幻,自云淡风轻

热门文章

  1. 【毕业设计】Java ssm校园兼职系统 大学生兼职系统
  2. preventExtention、freeze、seal及isExtensible、isFrozen 、isSealed比较
  3. 【无标题】linux指令
  4. 阶梯电价 (15 分)
  5. 我的少数派专栏《如何入门学术论文写作》上线
  6. 大疆tello的pc端控制方法(代码)
  7. 如何在php中显示170cm,人人都能170cm!想要显高?来看最实用的这4个方法!
  8. OPPO粟俊娥:OPPO研发云持续交付实践之路
  9. Linux 安装 RabbitMq 详细过程(含 Erlang 下载 网盘地址)
  10. STM32常用的开发工具有哪些