起因
项目中做了一个跳转第三方的需求,但是跳转过去是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的请求中也确实找到了不一致的字段
如何解决
其实上面的文章中也长篇大伦的列出了几条处理406的问题,但是无非也是让这个response和request中的字段对齐,因为这是第三方放回的地址,我们无法排查字段不一致的具体原因,更无法处理。
最终使用以下解决方案:
因为发现第三方的地址直接输入进url中可以直接打开,但使用了window.open('xx'),a=window.open(), a.location.href="xx",模拟a标签click等操作都无法打开。于是怀疑是否和请求头中的Refered字段有关系。于是使用a标签的rel="noreferree"清除跳转后携带的refered字段。最终成功打开第三方页面