encodeURIComponent(encodeURIComponent('小明'))
decodeURIComponent('%25E5%25B0%258F%25E6%2598%258E')
node -e "console.log(new URLSearchParams(location.search).get('q'))"

分享链接里的关键词变成 %25E5%25B0%258F%25E6%2598%258E,后端只解一次得到 %E5%B0%8F%E6%98%8E,搜索一条都匹配不到。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,编码做了两遍,第一次把中文变成 %E5 开头,第二次把百分号本身编码成 %25。解码只做一次,留在字符串里的仍是编码后的形态。

「重复 URL 编码」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:找到两次调用的位置 通常是一次在拦截器一次在拼接处;只在最终拼接 query 时编码一次;已经编码过的值不要再进 URLSearchParams;用 decodeURIComponent 做一次完整解码核对结果。

改完只确认一件事:分享链接里中文只出现一次百分号编码 后端拿到能直接匹配到记录。

作者 9823189