第 4 课

URL 与 Data URI 中的 Base64

标准与 URL-safe 变体,以及 `data:` 协议用法。

在 URL、查询串以及与 Cookie 相关的通道里,+/ 常常被错误解释;末尾的 = 填充 也容易在拼接逻辑里被破坏。为了解决这些问题,就出现了 URL 友好型(常称 Base64URL) 字母表与子集用法。

本节区分 MIME/Base64, RFC 4648 的 URL-safe, 以及 data: 资源内联的常见实践。

标准字母表 vs URL-safe 字母表

传统 Base64 用 62 → '+'63 → '/'

常见的 URL-safe 方案会:

  • +' 改成 '-'
  • /' 改成 '_'
  • 所遵循的标准允许时,省略末尾 =(例如 JWT 的 JWS 片段通常不带填充)

编码端和解码端的字母表必须一致。若在路径里直接塞进仍含 +// 的 MIME Base64却没做百分号编码,就会出现“间歇性坏的链接”。反过来,把一个本该用 Base64URL 的令牌拿去当 PEM MIME 解码,也一定会失败。

仍然可能需要百分号编码

即便换成 -/_,在 严格的 URL 解析场景(不同框架的参数解析、模板引擎、手工字符串拼接)里仍可能因为其它边界而出问题。应尽量使用 URLSearchParams、服务端 URL 组装库等结构化 API,而不是在裸字符串外面硬套分隔符。

与 JWT 的心智自检

JWT 的头/载荷部分是 UTF-8 的 JSON 字节 → Base64URL(常用无填充)。如果你看到的是大量 +//,多半是 MIME/PEM 风格,不要混在同一套解码流程里想当然。

data: URI

在 HTML/CSS 中内联非常小的二进制:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

结构要点:

片段含义
MIME 类型提示帮助浏览器解释字节语义
;base64,标记后面是经过 Base64 的字节载荷
载荷本体往往很长的一段连续 ASCII

优点:原型阶段少一次 HTTP,小图标更省事。

缺点

  • 体积约为原始字节的 ~4/3,源码膨胀明显;
  • CSP、邮件客户端、某些爬虫环境可能限制;
  • 与打包拆图、CDN 缓存等工程策略相悖。

正式上线里,哈希静态资源 + CDN 往往更稳妥——并不是因为 Base64 “错了”,而是因为 缓存、体积与工作流程综合来看更划算。

超大的 data:

极大的 data: 会拖累编辑器与大 DOM。Web 平台里对大文件更常见的是 Blob + object URL 或分块下载,而不是把整个文件 Base64 进页面。

要点小结

URL 场景同时考验 字符集是否“路径/查询友好”填充是否稳定。按 规范选择变体(JWT、PEM、MIME 各不相同),并统一走 库函数 做转换——避免随手 replace 几个字符却忘了边界字节的错误。

想动手练习时,可使用 DevCove 相关工具——可选,不属于本课正文。

打开相关工具

返回课程概览