跳转到内容
管理链接

为什么链接会丢失数据:修正查询参数与片段

了解 URL 中 & 与 # 的区别,避免重复编码,并通过 WikiURL 与浏览器检查准备分享的实际链接及其搜索结果。

WikiURL · 重定向 · 发布日期

放大镜帮助连接链接的不同组件,旁边有页面书签。

页面能打开,不代表收到的就是预期数据

你准备了一个搜索咖啡和茶的链接。页面打开了,但结果不符合你的意图。先别责怪服务器或短链接服务,应检查实际分享的完整地址。在虚构示例中,按常见表单参数解释方式,q=cafe&te 并不表示单个 cafe&te 值,因为 & 会分隔条目。此外,#precios 标记一个片段。在测试真实地址前,请把 example.invalid 换成你自己的、支持该查询的页面。

把诊断分成三个问题:想打开哪个页面,它应收到什么数据,之后应显示哪个部分?复制链接的 URL,而不只是按钮上可见的文字。编辑之前保存参考版本。本指南建议先检查组件,再用 WikiURL 检查结果;它并不保证所有网站都识别 q,也不保证成功响应等于正确搜索结果。

https://example.invalid/buscar?q=cafe&te#precios

如果 & 属于文本,就别把它用作分隔符

如果要按字面搜索 cafe & te,& 就属于 q 的值。使用 URLSearchParams 构建参数时,应传入未经编码的文本,序列化时会把该字符表示为 %26。MDN 说明,这个接口在把参数转换为文本时应用表单编码,并用 + 表示空格。这不意味着要替换 URL 中所有的 &,有些本来就是有意用于分隔参数的。

JavaScript 示例从基础地址构建 URL,设置搜索值,再单独添加片段。可以在本地 JavaScript 环境运行它,查看结果,而不会向虚构域名发送搜索请求。如果不写程序,请使用自己搜索页面生成的链接,避免手动拼接文字。比较预期值和网站显示的结果;看到链接中的 %26,还不足以判断特定应用如何解释数据。

const url = new URL("https://example.invalid/buscar");
url.searchParams.set("q", "cafe & te");
url.hash = "precios";
console.log(url.href);
// https://example.invalid/buscar?q=cafe+%26+te#precios

片段不是服务器收到的参数

MDN 文档说明,# 后面的片段由客户端处理,在请求资源时不会发送给服务器。页面可以用它跳到某个部分,例如 precios,也可以用于其他应用行为。因此,在 q=cafe#te 中,te 不会补全服务器在这次请求中收到的值。如果 # 应属于搜索文本,应在值内表示为 %23,第三个地址演示了这一点。

分别检查两个效果:搜索应显示预期结果,片段应到达目标位置。该部分必须存在,或应用必须识别片段。由服务器发起请求的检查器,不能单独证明浏览器会滚动到某一部分。也不要把删除全部片段当作万能修复;你可能恰好删掉收件人需要的链接部分。

https://example.invalid/buscar?q=cafe%23te#precios

只编码一次值,不要编码整个地址

RFC 3986 区分组件分隔字符与数据,并警告不要对同一字符串反复编码或解码。如果把已编码的 cafe%26te 传给期待未编码值的函数,百分号可能变成 %25,出现 %2526。这样是增加了一层编码,并没有自动保留预期搜索。示例中的两行可帮助识别这个变化。

修正方式取决于数据来源。如果来自人输入的文字,应把未编码文本交给参数构建接口。如果来自已有效的完整 URL,不要把整个地址当成单个值重新编码。记录每个函数或表单所期待的输入。避免全局替换 %、& 或 #,否则可能改变正确分隔符、必要参数,或原本不想修改的路径。

q=cafe%26te
q=cafe%2526te

用 WikiURL 检查响应,用浏览器检查内容

获得真实的公开地址后,把它粘贴到 WikiURL URL 检查器。查看返回的 HTTP 状态和最终目标。其实现从服务器发起查询并跟随重定向,这有助于发现意外目标。不要粘贴管理链接、密码或含私人数据的地址。不要检查示例中的 example.invalid,它在这里仅作为虚构目标。

还应在浏览器中打开真实版本,检查搜索和页面部分。成功响应可能加载了页面,却没应用预期筛选。如果有重定向,请把其参数与参考版本比较,并在浏览器观察片段。检查器不会替你理解应用逻辑,也不会认证安全性或证明用户账户有权查看内容。目的是结合响应证据与功能检查。

测试别人实际收到的那份链接

把最终链接粘贴到准备分享的渠道,在大范围分发前打开这份副本。确认没有把句末标点一起复制进去,没有遗漏部分,也没有把可见文字误当成目标。若内容应公开,测试时不要依赖管理员会话。如果生成二维码,还应检查扫描显示的地址,而不仅是原始文件。

保存简要记录:原始地址、预期搜索值、目标片段、分享的 URL 以及观察结果。如果失败,回到具体组件,修正后重新测试。只发布已检查版本。这样可以区分参数构建错误、改变目标的重定向和浏览器行为,而不会把“链接能打开”当作它保留了所有预期数据的保证。

打开工具 →

来源与文档

← 所有指南