在分享或发布任何页面之前,你需要知道网站地址中每个部分分别承担什么角色。本文用一个假设的URL来展示域名、路径、查询字符串和片段如何各自回答不同的问题,以及你怎样把这些答案记录下来供自己的项目使用。

域名回答什么问题,完整URL又回答什么问题

假设你正在筹备一个小型个人项目,想把其中某个特定页面分享给一位协作者。你会在浏览器中输入或粘贴的地址看起来像这样:https://example.org/notes/first-page?view=compact#intro。这是一个仅用于拆解字符串结构的假设地址,并不声称该页面真实存在或已经上线。把它当作纯粹的文本样本来观察,可以让我们专注于结构本身,而不必担心真实服务器会返回什么。

域名回答的问题是「浏览器应该联系哪台服务器」。域名是互联网基础设施的关键组成部分,因为它们为互联网上任何可用的Web服务器提供了人类可读的地址。计算机之间通过IP地址通信,但人们很难记住那些数字串,所以域名作为可读的替代方案而存在。在我们的例子中,example.org就是域名,它告诉浏览器该联系哪台服务器,仅此而已。1

完整URL回答的是一个更具体的问题:「那台服务器上的哪一个资源」。URL是互联网上某个唯一资源的地址,也是浏览器用来获取已发布资源(如HTML页面、图片或文档)的关键机制之一。上面那个完整地址所做的不仅仅是命名服务器,它还指定了路径、查询和片段。这些额外的部分各自缩小了浏览器应该请求什么内容,或者在资源加载后应该滚动到哪个位置。2

逐段阅读这个示例地址

现在来标注假设地址中的每个组成部分。方案是https,它指示浏览器必须使用哪种协议来请求资源。域名是example.org。路径是/notes/first-page。查询字符串是view=compact,它紧跟在问号之后开始。片段是intro,它紧跟在井号之后开始。把这些标签写在字符串旁边,是理解整个地址如何运作的第一步。2

问号标志着查询部分的开始。参数是提供给Web服务器的额外键值对,当存在多个参数时它们用&符号分隔。在我们的例子中只有一个参数:view=compact。井号标志着片段的开始,片段相当于资源内部的一个书签。对于HTML文档,浏览器会滚动到锚点所定义的位置。值得注意的是,片段标识符不会随请求一起发送给服务器。2

域名部分本身也有内部结构。TLD是分层DNS中最通用的域,也是域名的最后一个组成部分;在example.org中,TLD是org。紧挨在它前面的标签example是二级域名。它们共同构成URL的主机部分。ICANN指定各组织来管理每个TLD,根据管理组织的严格程度不同,TLD可以充当网站用途或归属的线索。3

相同主机,不同路径与查询

现在保持主机部分固定为example.org,只改变路径。如果地址变成https://example.org/about,浏览器仍然会联系同一台服务器,但路径部分不同了。字符串/about替代了/notes/first-page。我们只是在观察一个地址到另一个地址之间文本如何变化,并不是在声称服务器对任一路径实际会返回什么。要点在于路径是一个独立的段落,你可以替换它而不必触碰域名。

类似地,如果查询从view=compact变为view=full,问号后面的字符串就不同了,而域名和路径保持不变。这说明查询部分携带的是独立于路径的额外信息。你也可以完全去掉查询,留下https://example.org/notes/first-page,这个地址在结构上仍然有效。每个可选部分都可以存在或缺失,而不会破坏整体格式。

你可以把这些观察组合起来,看到一个域名如何出现在许多不同的URL中。域名保持不变,而路径、查询和片段各自变化。当你为自己的项目规划页面时,把地址想象成一组独立的槽位,有助于你预测改变其中某一部分时其余部分不受影响。这是关于地址格式的字符串层面观察,不是关于任何特定服务器如何处理请求的陈述。

为你的项目制作一张地址说明卡

记录页面用途时,先用一句简短的话写清楚目的,再写下地址本身。对于我们的假设项目,目的可以写成:「项目笔记本中第一篇笔记的紧凑阅读视图。」先声明目的能给你一个参照点,方便日后向别人解释这个地址,或者检查它是否仍然与页面实际内容匹配。

在说明卡的下一行写出完整地址:https://example.org/notes/first-page?view=compact#intro。然后在下方列出每个部分及其标签。方案:https。域名:example.org。路径:/notes/first-page。查询:view=compact。片段:intro。这样的排列让每个部分一目了然,之后你把说明卡和实际地址对比时也容易发现遗漏或错位的字符。

再加一条简短备注,说明哪些部分是你刻意选择的,哪些部分可能会变。例如,你可以注明路径反映了你为可读性而做的类文件夹命名决策,而查询参数是你正在使用的某个工具添加的,如果工具更新它可能会变。区分你自己的选择和外部生成的字符串,有助于你决定哪些部分需要保护,哪些部分可以安全更新而不会破坏已经分享出去的链接。

通过手工复制与逐项标记来核对说明卡

这套核对流程是作者建议,不是任何规范中的规则。目标只是在公开分享地址之前抓住拼写错误或遗漏字符。

整个检查只需要一两分钟,但它能培养一个习惯,防止日后出现令人困惑的错误,尤其是当地址因为更多参数或更深层路径而变得更长的时候。

如果发现不匹配,先修正说明卡,然后从头重新检查。不要孤立地修补单个字符,因为一处修正可能会改变你对后续段落的阅读。

步骤 1

把完整地址从说明卡复制到一个纯文本编辑器中。不要粘贴到浏览器或富文本字段里,因为那些环境可能隐藏或改变字符。纯文本视图能让你看到字符串中实际包含的内容。

步骤 2

直接在文本中标注每个段落。在方案之后、域名之后、路径之后、问号之后和井号之后分别放置一个括号或注释。例如,你可以在一行写「方案:https」,在下一行写「域名:example.org」,从左到右依次处理整个地址。

步骤 3

把你标注好的各段与上一节制作的说明卡进行对比。检查路径是否一致,查询的键和值拼写是否完全相同,片段文本是否一样。如果有任何不同,记下哪个段落有误,修正之后再继续。

保留这份说明供以后写作或沟通使用

把完成的说明卡存放在你写项目相关内容时自然会查看的地方。项目文件夹中的一个简单文本文件、你常用笔记工具中的一条记录,甚至配置文件顶部的一行注释都可以。格式不如习惯重要——关键是让说明卡紧挨着它所描述的工作,这样你需要把地址粘贴到文档、邮件或聊天消息中时随时可以瞥一眼。

当项目增长时,你可以用同样的说明卡格式扩展到更多页面。每个新页面占一行,写上完整地址和一句用途说明。随着时间推移,这就变成了一份小型地址清单,让你一眼看出哪些路径存在、用过哪些查询、定义了哪些片段。你不需要专门的工具来做这件事;对于个人或小团队项目来说,一份纯文本列表就够了。

如果你之后决定更改路径或移除某个查询参数,同时更新说明卡。这能让你的书面记录与你实际分享的地址保持一致。说明卡是你自己的参考,所以你选择包含什么详细程度由你决定。有人只记录完整地址和用途;有人还会记下创建页面的日期或选择某个路径名称的理由。挑选能帮你避免混淆的字段,其余省略即可。

常见问题

域名和URL是同一个东西吗?

不是。域名标识的是服务器,而URL是某个特定资源的完整地址。域名是URL内部的一个组成部分;URL还包含方案、路径,以及可选的查询和片段。12

URL中的问号起什么作用?

问号标志着查询部分的开始。问号之后的所有内容都是提供给Web服务器的键值对参数。在我们的例子中,view=compact就是查询。2

片段部分会被发送到服务器吗?

不会。片段标识符出现在井号之后,它不会随请求一起发送给服务器。它告诉浏览器在已加载的资源内部应该滚动或跳转到哪个位置。2