详情页路径拼成 /doc/C++ 入门#2,请求到后端只剩 /doc/C++ 入门,锚点后面的内容被浏览器截掉,接口返回 404。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
encodeURIComponent('C++ 入门#2')
curl 'http://localhost:8080/doc/C%2B%2B%20%E5%85%A5%E9%97%A8%232'
node -e "console.log(encodeURI('/doc/a#b'))"
# 在 URL 里是片段标识符的起点,浏览器不会把它发给服务端。路径参数里出现 # 必须编码成 %23。这一点先确认清楚,后面就不用反复试。
「URL 井号截断」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,路径参数统一用 encodeURIComponent;路由层不要手工拼接字符串;后端解码后按原值查询;对含特殊字符的路径补一条用例。
改完照着核一遍,请求行里能看到 %23 后端收到的路径参数包含 # 能查到对应文档。
