项目406以及相关问题处理

178 阅读3分钟

起因

项目中做了一个跳转第三方的需求,但是跳转过去是406。之前也确实没见过这个响应码。在事后记录一下相关情况。

406错误码

经过查找以及结合MDN,找到一篇看似比较全面的406报错介绍

什么情况会406报错

在第一次请求期间,浏览器告诉服务器它可以接受的所有文件格式。它被称为Accept-头请求,它会提示服务器以正确的格式交付文件,以生成整个网站或web应用程序。

有时,服务器发送的回复格式不合适,或者违反了浏览器或客户端制定的规则。在这种情况下,浏览器窗口中会出现406错误,表明服务器没有传递适当的数据。

以下是标头请求中可能出现的“错误格式”和“违反规则”的一些示例:

  • Accept-ranges:  有些服务器已经设置了安全措施,或者在响应中只允许特定的文件大小范围。如果响应试图发送太多超出允许范围的字节,您将看到406错误。.
  • Accept-encoding:  表示可以浏览器接受的文件压缩方式。某些压缩方法和格式不被接受,导致出现406错误代码.
  • Accept-charset:  指字符集或站点文件表如何使用代码(如CSS和HTML)并将其转化为可理解的字符。世界上有太多的字符、语言和符号,很难涵盖所有这些。标准表格被称为ISO-8859,但也有其他补充表格。出现不被接受的字符时出现406.
  • Accept-language: 通常情况下这就是accept-charset的别名
  • MIME type violation:  有时,浏览器会向服务器请求特定的MIME类型。MIME类型是JPEG图像、特定视频格式或简单文本等内容元素。如果服务器无法提供所请求的MIME类型,如JPEG图像,则会出现406错误。

总结来说,就是浏览器可以接受的编码,数据信息和服务器所提供的不一样。

在406的请求中也确实找到了不一致的字段

image.png

如何解决

其实上面的文章中也长篇大伦的列出了几条处理406的问题,但是无非也是让这个response和request中的字段对齐,因为这是第三方放回的地址,我们无法排查字段不一致的具体原因,更无法处理。

最终使用以下解决方案:

因为发现第三方的地址直接输入进url中可以直接打开,但使用了window.open('xx')a=window.open(), a.location.href="xx",模拟a标签click等操作都无法打开。于是怀疑是否和请求头中的Refered字段有关系。于是使用a标签的rel="noreferree"清除跳转后携带的refered字段。最终成功打开第三方页面