URL 解析 - 基础知识
URL 解析
这是我们在本文中的示例:
https://username:password@www.example.com:443/path/to/page.html?query=file#fragment
该 URL 的格式基于通用 URI 语法,如下所示 [2]:
URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]
需要注意的是,‘authority’ 可以具有以下语法:
authority = [userinfo "@"] host [":" port]
URI 结构
URI 结构是必需的,但通常被应用程序隐藏。例如,在浏览器中,http 或 https 是默认的并隐含的。
示例:
https:// ssh:// tel://
这通常也称为“协议”,表示如何访问该资源。
URI 方案名称的官方注册表由 IANA 维护,网址为 http://www.iana.org/assignments/uri-schemes。IANA 列出了已注册的和从未注册的保留方案 [1]。
Dan Connolly 维护了一个庞大的(但现已退休)公共已注册和未注册方案列表。同时,大量的私有方案仅供公司内部使用。
RFC4395 解释了注册程序并提供了一些指南。旧版本的标准是 RFC2717(注册)和 RFC2718(指南)。
顺带一提,双斜杠是 Tim Berners-Lee 的选择,但他对此感到后悔,因为它们没有其他用途。
用户信息
用户信息是可选的,通常会被应用程序忽略。大多数浏览器会忽略该信息或发出警告,因为它存在安全风险。
示例:
ssh://username@example.com:2222
Host
这是Host部分。它可以是相同的系统、主机名、IP 地址或域名。
示例:
ldap://[2001:db8::10]/c=GB?objectClass?one # 需要将 IPv6 地址放在方括号中
https://ittavern.com/url-explained-the-fundamentals/
vnc://10.10.20.57:5900
域名
我们简要讨论一下域名的世界。
示例:
www.example.com # 完整域名
www # 子域名
example # 二级域名(SDL)
com # 顶级域名(TLD),也称为域名后缀或域名扩展
. # 引用:根区域,不再详细讨论
二级域名必须仅包含字母(a-z)、数字(0-9)和短划线('-'),但不能以短划线开头。此外,域名不区分大小写,意味着 ITTAVERN.COM 和 ittavern.com 是相同的。二级域名的最大长度为 63 个字符。子域名受相同规则约束,但还可以包含下划线(_),虽然不推荐,但某些服务要求这样做。例如,微软的某些 SRV DNS 服务使用 _sipfederationtls._tcp.example.com。浏览器可以接受,但并不能保证兼容性。
每个点之间的字符串称为标签,一个标签的最大长度为 63 个字符。完整域名的最大长度为 253 个字符,包括点。
目前注册的顶级域名(TLD)有将近 1500 个。截至本文发布时,具体数量是 1470 个。
kuser@pleasejustwork:~$ curl https://data.iana.org/TLD/tlds-alpha-by-domain.txt | sed '1d' | wc -l
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 9828 100 9828 0 0 11506 0 --:--:-- --:--:-- --:--:-- 11494
1470
所有顶级域名的列表可以在 IANA 的文档中找到。
顶级域名有两种类型:通用顶级域名(gTLD),如 .com、.info、.net,以及国家代码顶级域名(ccTLD),如 .nl、.de、.us,还有一些组合形式,如 .co.uk 或 .com.au。
以下是翻译:
端口
许多方案都有默认端口号,这使得大多数程序可以隐藏端口号,避免给用户带来混淆。例如,http 使用端口 80,https 使用端口 443,ssh 使用端口 22,等等。同样适用于传输协议,如 TCP 或 UDP。这些是必需的,但大多数应用程序会隐藏它们,如果使用的是默认端口,例如,浏览器会隐藏 :443 并显示 :10443,如果使用的是 https 协议。
路径
路径是一个从左到右的分层命名系统,用于子目录或子文件夹和文件,是必需的。与域名不同,路径是区分大小写的!
示例:
https://ittavern.com/images/logo.png
https://ittavern.com/random-post/
https://duckduckgo.com # 路径缺失,但隐含根目录 /
顺带一提,第一个示例指向一个图片,在第二个示例中,你可能注意到文件缺失。浏览器会打开 random-post 子文件夹,并且 web 服务器配置为提供预定义文件。通常这些文件称为 index.html,但这取决于设置。这也被称为“漂亮的 URL”。
查询
查询包含可选参数,可以在服务器或客户端使用。常见的用例包括引用信息、变量、选项设置等。参数之间的分隔符是 & 和 ;。
示例:
https://www.twitch.tv/randomstream1231?referrer=raid # 在 Twitch 上,显示观众的来源
https://youtu.be/dQw4w9WgXcQ?t=4 # 在 YouTube 上,它告诉客户端视频从何处开始播放
https://youtu.be/dQw4w9WgXcQ?list=PLi9drqP&t=9 # 包含播放列表和时间戳的多个参数
路径
路径是可选的,用于引用资源中的特定位置。例如,在 HTML 文件中的锚点。
https://ittavern.com/url-explained-the-fundamentals/#fragments
绝对 URL 和相对 URL 之间的区别
到目前为止,每个 URL 都是绝对 URL。相对 URL 通常仅包含路径,需要引用或基本 URL 才能工作。
示例:
/de-DE/same-page-different-lang
/img/logo.png
URI 和 URL、URN 及 URC 的区别
URI 代表统一资源标识符,是一串用于标识任何事物的唯一字符,由网络技术使用。URI 可用于标识任何逻辑或物理的东西,从地点和名称到概念和信息 [2]。
URI 是 URL(统一资源定位符)、URN(统一资源名称)和 URC(统一资源特征)的超集。例如,每个 URL 都是一个 URI,但并非每个 URI 都是 URL。尽管如此,实际上 URI 和 URL 经常可以互换使用。
这些不同的子集有不同的任务:URN 用于标识项目,URL 告诉你如何定位和访问项目,URC 指向该项目的特定元数据。可以在各自的部分找到示例。
URL
URL 代表统一资源定位符,指定了一个已标识资源的位置以及访问它的机制。更多详细信息请参见上文。
URN
通过唯一且持久的名称标识资源,而不包含任何位置信息。
示例:
urn:isbn:n-nn-nnnnnn-n # 通过 ISBN 号识别书籍
urn:uuid:39ab000da-3f9a-abe2-1337-123456789abc # 全局唯一标识符
urn:publishing:book # 一个 XML 命名空间,标识该文档为书籍类型
顺带一提,isbn(如第一个示例中所示)是一个 URN 命名空间标识符(NID),而不是 URN 方案或 URI 方案 [1]。有人会将 NID(见下表)称为与 URL 等价的 URI 方案,这是不正确的。
每个 URN 应该具有以下结构:
URN # 方案规格前缀
NID # 命名空间标识符(字母、数字、短划线)
NSS # 命名空间特定字符串,用于标识资源(可以包含 ASCII 码、数字、标点符号和特殊字符)
URC
URC 代表统一资源特征或统一资源引用。根据维基百科,前者是当前使用的名称。
URC 指向资源的元数据,而不是资源本身。一个简单的例子是一个 URC,它指向主页的源代码:
view-source:http://example.com/
不过,从未制定出最终标准,URC 也从未被广泛采用。