简体中文

开发者工具 · URL 编码器和解码器

URL 剖析:方案、权限、路径、查询和片段解释

· 背景

url 结构 网络标准 开发者工具

五个用分隔符标记的 URL 组件
原始 ToolAcre 矢量图

每个百分比编码决策都取决于字符位于 URL 的哪个部分。这篇文章命名了 RFC 3986 中的五个组件,展示了每个分隔符的含义以及片段永远不会到达服务器的原因。

为什么相同的 # 在一个地方没问题,但在另一个地方却破坏了链接——一个组件问题,而不是字符问题

URL 中的井号字符 (#) 根据其出现位置的不同,含义完全不同。在像 ?search=C%23sharp 这样的查询字符串值中,必须将其编码为 %23 才能安全。在像 https://example.com/page#section, 这样的 URL 末尾,它标记了片段分隔符,并且它后面的所有内容都是片段。一个字符,两种上下文,两种不同的含义。这就是为什么编码决策取决于您正在使用的 URL 的哪一部分。

问号(?)也具有双重性。在路径或查询值内,必须将其编码为 %3F 才能显示为数据。作为路径和查询字符串之间的文字字符,它是结构语法。了解这五个组件(方案、权限、路径、查询和片段)是正确 URL 处理的基础。

五个组成部分:方案、权限、路径、查询、片段 - 以及分隔它们的分隔符

RFC 3986 正式将 URL 定义为具有五个组成部分:方案、权限、路径、查询和片段,并由特定分隔符分隔。首先是方案,然后是 ://, 然后是权限,然后是 /, 然后是路径,然后是 ?,然后是查询,然后是 #,然后是片段。并非所有组件都出现在每个 URL 中。最小 URL 可能只有方案和路径,例如“mailto:user@example.com”。完整的 URL 包括所有五个。

每个组件都有自己的语法规则。冒号在方案中保留,斜杠在路径中保留,& 符号在查询中保留。保留字符作为数据出现时需要编码:路径值中的斜线变为 %2F。

权限内部 — 用户信息、主机和端口,以及为什么保留 @ 和 :

权限组件包含资源的网络地址:用户名、密码、主机名和端口。格式为[用户信息@]主机[:端口]。 userinfo和host用@分隔;主机和端口以 : 分隔。这些@ 和: 字符在权限范围内保留以分隔这些子组件。如果您的用户名包含@符号,则在连接它之前必须对其进行百分比编码。例如,“user@email.com:password”作为用户名将在最后的@之前变为“user%40email.com:password”。

主机名可以是注册域(如 example.com)、点分十进制的 IP 地址(如 192.0.2.1)或用方括号括起来的 IPv6 地址(如 [::1])。端口可选;如果省略,则该方案确定默认值(http 为 80,https 为 443 等)。 userinfo 部分很少在现代 URL 中使用,但仍然是语法的一部分。

路径段和/的含义——层次结构和点段解析

路径是由正斜杠分隔的段序列。路径 /a/b/c 具有三段:a、b 和 c。每个段可以包含非保留字符、百分比编码字符或在此上下文中安全的某些保留字符。段内的斜杠必须编码为 %2F 以避免与段分隔符混淆。路径是分层的;它意味着 a 是一个位置,那么 a/b 更具体。

路径还支持特殊的点段:单个点 (.) 表示“当前目录”,两个点 (..) 表示“父目录”。像 ../../etc/passwd 这样的路径向上解析。现代 URL 和 HTTP 避免使用这些,但它们存在于语法中。如果不希望字面点的含义,则包含字面点或双点的路径段必须进行百分比编码。

查询和片段 - 键值约定,以及片段保留在浏览器中的原因

查询字符串遵循路径并以 ? 开头。传统上,它是一系列由 & 分隔的键=值对,尽管语法实际上是非结构化的——查询中可以包含任何内容。如果您的值包含 & 或 =,则这些字符必须进行百分比编码,这样它们就不会被误认为分隔符。查询被发送到服务器;服务器决定如何处理它。

该片段位于查询之后并以 # 开头。 # 之后的所有内容都是片段,它永远不会到达服务器。浏览器在本地处理片段,通常是为了跳转到命名锚点或指示单页应用程序中的状态。由于片段永远不会到达服务器,因此具有不同片段的 URL 将被视为指向相同的资源。

工作示例:剖析一个很长的现实世界 URL — 标记每个组件和每个分隔符

取 URL "https://user:pass@example.com:8080/path/to/page?search=hello&sort=date#results". 方案为 https。权限为 user:pass@example.com:8080,分为 userinfo (user:pass)、主机 (example.com) 和端口 (8080)。路径为 /path/to/page,,其中包含 path、to 和 page 段。查询为 search=hello&sort=date,包含两个参数。片段为将这个 URL 输入到 URL 编码器和解码器中,查看该工具如何对每个组件进行标记和编码。

如果搜索包含 &,例如 ?search=R&D,则在正确编码后将变为 ?search=R%26D。百分比编码的字符不会在文本中创建视觉边界,因此仔细的编码和解码对于正确的解析至关重要。

这不包括什么 - 相对参考解析和特殊方案,例如 mailto: 和 data:

相对引用(例如“../page"”或“?query=value”)在 HTML 中有效,并相对于当前文档进行解释,但它们有自己单独的解析规则。 mailto:、data: 和 file: 等特殊方案遵循完全不同的规则,并且不是标准的绝对 URL。

这篇文章仅关注检查器演示的标准绝对 URL 结构。相对引用需要一个基本 URL,然后才能解释其组件,而诸如 mailto 和 data 之类的方案不共享相同的权限和路径形状。将这些情况分开可以防止从 HTTPS 地址学习的规则被盲目地应用于具有不同分隔符、解析步骤或传输行为的语法。

要点:在编码之前了解组件 — URL 编码器和解码器的单值和全地址模式如何映射到此结构

您正在编码的组件确定哪些字符需要转义以及哪些字符是安全的。斜杠是路径中的文字语法,因此值中的斜杠必须是 %2F。在查询中,如果 & 和 = 出现在值中,则必须对它们进行编码。 URL 编码器和解码器有两种模式:用于编码单个值的“组件”模式和用于编码完整 URL 的“完整地址”模式。通过连接各个部分来构建 URL 时使用组件模式;使用完整地址模式来验证现有 URL。

了解这五个组件及其分隔符可以让您在每次遇到编码任务时正确选择。