昨天运营同事反馈某个链接点击后提示invalid URL escape "%"
导致落地页不能正常展示,下午抽空对此问题进行排查确认,没想到竟然是链接过长被浏览器截断编码解析失败导致;
在我的浏览器相应位置点击可以正常跳转,同事的浏览器不行,一问才发现原来对方用的是360极速浏览器,于是我也下载了相同版本的浏览器,点击依然可以正常跳转,截止目前看了服务的日志,并没有错误,把点击链接在本地进行调试,解析也是正常的; 后来同事发现自己使用的是兼容模式,于是我也切换到兼容模式然后找到对应位置复制了链接,果然问题复现,出现了invalid URL escape的错误;
在此之前,翻了下go的源码,调用 url.QueryUnescape(string) 中的unescape的时候会返回 EscapeError(s)
func (e EscapeError) Error() string {
return "invalid URL escape " + strconv.Quote(string(e))
}
但是server并没有将此错误返回到前端,因此问题可能出在浏览器上;将错误的url单独粘贴出来打开浏览器的network 工具,发现了问题,返回错误代码 http 442[1],此代码表示浏览器不能正确处理url的指令; 对比了正确的url 和兼容模式下的url 发现,差别在最后的tagname参数上,正常的链接中参数如下: “&tagname=%E5%9B%BE%E7%89%87%3A%3A19810348” 异常的参数为:”&tagname=%E5%9B%“,由于IE对get请求的最大长度做了限制截断,并且tagname中使用了中文编码,因此截断后的tagname不能正确被浏览器解码出现错误,具体可在console中进行解码;
decodeURIComponent("%E5%9B%")
VM168:1 Uncaught URIError: URI malformed
IE对字符最大长度限制为2082,具体见IE的主题的介绍。
Microsoft Internet Explorer 的 URL (統一) 長度為 2,083 個字元。 Internet Explorer 的路徑長度上限為 2,048 個字元。 此限制同時適用于 POST 要求和 GET 要求 URL。
如果您使用的是 GET 方法,則限制為最多 2,048 個字元,減去實際路徑中的字元數。
不過,POST 方法並不限於提交名稱/值對的 URL 大小。 這些配對會移轉到頁標題,而不是在 URL 中。[2]
至此问题可以告一段落,让运营同事给前端反馈修改tagname为英文,服务端生成的链接后续想办法缩短就可以避免上述问题;
本文链接:https://iokde.com/post/invalid-URL-escape.html,参与评论 »
--EOF--
发表于 2021-07-16 10:23:00,并被添加「日常琐碎」标签。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。tools更多说明 »
提醒:本文最后更新于 1054 天前,文中所描述的信息可能已发生改变,请谨慎使用。
Comments