发布时间:2023-2-19 分类: 行业资讯
背景
前段时间,我突然收到一位同事的报道,他说有一名来自湖江的老师无法登陆海外的胡江账户。这是一个非常常见的错误,但故障排除过程并不简单。我们有很多惊喜,并在这里与大家分享。
我们首先判断,从故障现象的角度来看,它应该独立于后端,但与前端有关,所以我们很快就看了前端日志。从日志的角度来看,它主要用于判断客户端的地理位置接口的连续错误。出现了大量HTTP状态代码406(24小时内超过1w)。根据HTTP状态代码规范,4开头的错误代码与客户端相关。考虑到该故障仅发生在教师身上,初始判断406是问题的根源。
随着获得的信息和分析的深入,我们很快解决了外籍教师的过错。不幸的是,它确认它与406无关。
但是,我们不能就此止步。毕竟,正常的HTTP状态代码应该是200,那么大数量的406是多少?为什么我们不能重现?它们是如何触发的?如此多的爆发应该引起用户的反馈?为何在线?反馈是否如此平静?
下图显示了日志平台中的406错误
故障排除过程
为了确保性能,我们的Node端不会详细记录每个请求,因此只需查看406日志就不知道具体原因。为了解决这个问题,我们紧急发布了一个在线补丁来记录每个请求的详细信息,然后在日志平台中看到以下请求
为了便于比较,我们在浏览器上截获了正常请求。如下图所示
通过仔细比较这两个请求,结合错误代码406的定义,我们的重点是Accept头。
在日志中
和普通的浏览器行为
因此,我们在Postman中模拟了错误的请求,当然,我们重现了406错误,因此我们可以确认问题是由Accept字段引起的。
406 Not Acceptable状态码表示客户端错误,表示请求的资源的content属性不能满足请求头中的条件,因此无法生成响应实体。从HTTP协议规范RFC文档转换
我们在线检查了这些信息,并与后端同事讨论了406的错误代码。我们了解到,如果请求标头的Accept不符合事先商定的合同,则会返回406错误。错误是API服务,它以application/json格式返回数据。但是,请求中的Accept表示它不支持此格式,因此将报告406错误。
我们仔细检查了普通浏览器发送的请求,发现所有包括Accept: */* ;.看起来这些触发406的请求不是普通用户发送的。那么,谁提出了这些要求?
是CDN吗?
CDN的全名是内容分发网络,即内容分发网络。目的是使用户能够获得附近所需的内容,解决因特网网络的拥塞,提高访问代购源码网站的用户的响应速度。 CDN网络可以将服务器的内容缓存到分布在世界各地的CDN节点,并根据用户的访问IP连接到CDN,以提高代购源码网站的响应速度。 (引自google.com)
现在CDN是各个公司的共同配置,而且Hujiang也不例外。我们仔细研究了请求406的源IP,发现它们都是来自北京联通的几个节点。在这种情况下,怀疑CDN非常大。可能有两种可能:1。原始请求标头的Accept字段错误; 2.原始请求标头的Accept字段是正确的,但在通过CDN节点时传递。 CDN已被篡改。由于先前CDN篡改头部的问题,我们最初判断CDN的问题。
接下来,我们暂时将北京联通的节点返回源,验证CDN已经篡改了头部并获得了最终用户IP。在Internet上搜索有关Internet的详细信息,Internet是搜索引擎的爬虫。事实证明,406不是普通用户,而是搜索引擎爬虫。
亮点
在写文章的过去几天里,我发现错误日志丢失了很多,406错误消失了。我认为某个搜索引擎悔改,所以我使用当时出错的IP来搜索日志平台,发现搜索引擎只是改变了策略。其Accept字段已被修改,并且UA标题已添加了搜索引擎的唯一徽标,该徽标已成为常规搜索引擎。
总结
对于开发人员来说,当代购源码网站遇到大量406错误时,不要过于担心,检查日志,很可能是搜索引擎爬虫造成的。
总结这406错误代码事件,当搜索引擎抓取Hujiang页面时,请求标头将Accept设置为与后端服务接受的Accept字段不同,导致大量406错误。
最后,详细解释“在标题中接受”的相关知识
接受
它在标头中用于告诉客户端客户端可以处理的内容类型。此类型的内容由MIME类型(从MDN引用)
表示内容类型
Text/html,application/xhtml + xml,application/xml都是MIME类型,也可以称为媒体类型和内容类型。
在示例中,application是一个类型,json是一个子类型。它表明客户端只能接收此类应用程序/json的响应。如果服务器无法返回此类响应,则服务器应返回406错误。
通配符*代表任何类型
例如:Accept: /表示浏览器可以处理所有类型
Accept可以支持由
分隔的多种类型利用内容协商机制,服务器可以选择许多备选方案中的一个用于应用程序,并使用Content-Type响应头来通知客户端它的选择。
它表明客户端只能接收三种类型的响应:text/html,application/xhtml + xml,application/xml。
因子重量(q)
q是介于0和1之间的值,q的默认值为1,q=0是不可接受的,q的值越大,请求越倾向于在< ;;< ;;“之前获得类型的内容。/p >>
它表明客户端更喜欢text/html格式的响应,然后是application/xhtml + xml,最后是application/xml,*/*。