URL 编码解释:为什么空格变成 %20
您已经在网址中看到过它:%20 应该是空格,或者 %3D 而不是等号。这就是 URL 编码(也称为百分比编码),虽然它看起来像是胡言乱语,但它解决了保持网络正常运行的实际问题。这就是发生的事情。
为什么 URL 需要编码
URL 只能安全地包含一组有限的字符 - 字母、数字和一些符号。许多字符具有特殊含义(? 开始查询字符串,& 分隔参数,/ 分隔路径段)或根本不允许(空格)。如果您将这些字符按原样放入 URL 中,浏览器和服务器会感到困惑。编码将它们替换为安全的表示形式。
它是如何工作的
百分比编码将不安全字符替换为 % 后跟其两位十六进制字节值。空格是字节 32,十六进制表示为 20 — 因此是 %20。等号变为 %3D,与号变为 %26,依此类推。使用我们的URL编码器和URL解码器立即对任何字符串进行编码或解码。
一个实际例子
假设您想要“café & bar”的搜索 URL。空格和与号必须进行编码:
https://example.com/search?q=caf%C3%A9%20%26%20bar
注意“é”变成了 %C3%A9 — 非 ASCII 字符被编码为其 UTF-8 字节,可以是多个百分比对。 MDN 百分比编码参考涵盖了详细信息。
重要的地方
- 查询参数:用户在搜索和表单中输入的内容必须进行编码,以免特殊字符破坏网址。
- API:在 URL 中传递值需要编码才能保持有效。
- 带有跟踪的链接:广告活动网址通常带有编码值。
常见陷阱
两大问题:双重编码(对已编码的字符串进行编码,将 %20 转换为 %2520)和忘记对用户输入进行编码,这可能会破坏链接或打开安全漏洞。如有疑问,请解码 URL 以检查其实际包含的内容。
保留字符与非保留字符
并非每个字符都需要编码。该标准定义了非保留字符 - 字母、数字和 - _ 。 ~ — 始终保持原样安全。 保留字符,例如 / ? # & = 在 URL 中具有特殊的结构含义,因此在用作数据而不是分隔符时必须对它们进行编码。这就是对用户输入进行编码的关键:包含“&”的搜索词必须变为 %26,否则“&”将被误读为新参数的开头。
加号和空格混乱
一个经典的陷阱:在旧表单提交的查询字符串中,空格有时被编码为 + 而不是 %20,因为这就是 HTML 表单数据(application/x-www-form-urlencoded 格式)历史上的工作方式。在 URL 的路径中,空格始终为 %20,文字 + 表示加号。这种分裂就是为什么相同的“空间”可以以两种方式出现,以及解码错误的上下文会损坏数据的原因。如有疑问,请解码并检查。
编码和安全
正确的编码不仅仅是有效的链接——它还是一个安全边界。如果无法对最终出现在 URL 中的用户输入进行编码(或验证),可能会导致注入攻击和损坏的重定向。框架通常提供内置的编码函数;使用它们而不是手动滚动,并且永远不要相信 URL 中的原始用户输入。正确的编码可以使您的链接保持有效并使您的应用程序更安全。
底线
URL 编码将不安全字符交换为 % 加上其十六进制字节值,因此无论 URL 包含什么内容,它们都保持有效。空格变为 %20,特殊符号获得自己的代码,非 ASCII 字符使用其 UTF-8 字节。对用户输入进行编码,避免双重编码,并使用工具进行检查 - 这些神秘的百分号不再是一个谜。