You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox误将href中URL编码部分识别为完整href值的问题

问题原因

这个解析差异本质是不同浏览器对a标签href属性的URL解码时机实现不一致导致的,不是代码写法错误:

  • Chrome现行版本严格遵循WHATWG URL标准解析逻辑:拿到href属性值后会先拆分协议、域名、路径、查询参数等URL结构段,仅对各分段内容做对应解码,查询参数内部的编码内容永远不会被识别为URL结构的一部分。因此示例中查询参数里经过编码的地址始终作为endpoint的参数值存在,不会干扰外层URL解析,结果符合预期。
  • 你遇到的异常解析仅出现在Firefox 118之前的旧版本:这些版本的URL解析器存在预解码逻辑,会在拆分URL结构之前,先对整个href属性值做一次全量百分号解码。示例中编码的https%3A%2F%2Fbing.com%2Fmaps经过这次预解码后会变成完整的https://bing.com/maps地址,旧解析器识别到内嵌的https://协议头后,会错误将这个内嵌地址判定为整个href的目标地址,丢弃外层的URL前缀。
是否为Firefox的bug

这个表现属于Firefox旧版本不符合现行URL标准的实现缺陷,并非预期设计行为。Mozilla在Firefox 118正式版中已经对齐了WHATWG URL标准的解析逻辑,修复了这个问题,升级到最新版Firefox后,解析结果会和Chrome完全一致。

旧版本兼容方案

如果需要覆盖尚未升级Firefox的用户,可以对嵌套在查询参数中的URL做二次URL编码:将参数值里的%额外编码为%25,修改后的代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  </head>
  <body>
    <main>
      <a href="https://google.com/maps?endpoint=https%253A%252F%252Fbing.com%252Fmaps">Click me</a>
    </main>
  </body>
</html>

二次编码后,即使浏览器触发预解码,也只会先把%25还原为%,不会提前将%3A、%2F解码为冒号和斜杠,也就不会错误识别出内嵌的协议头,所有版本浏览器都能正确解析外层目标地址。


内容的提问来源于stack exchange,提问作者charbroil2329

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 00:12:16