第一次准备网站时,“域名”和“URL”这两个词会反复出现,但它们指的不是同一件事。混淆二者会让与协作者或未来读者的沟通变得不必要地困难。本文用一个假设地址做拆解练习,展示域名在哪里结束、完整URL从哪里开始,并给出一种实用的记录方法。

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

假设你正在规划一个小型个人站点,用来发布读书笔记。你需要确定一个访问者可以在浏览器里输入的地址。在做决定之前,先理解域名和完整URL分别回答的是两个不同的问题。域名标识的是你想访问的那台网络服务器。MDN解释说,域名为互联网上任何可用的网络服务器提供了一个人类可读的地址,因为原始的IP地址难以记忆,而且可能随时间变化。所以当有人在浏览器里输入一个域名时,被回答的问题是:我应该联系哪台服务器?1

URL则更进一步。它不仅告诉浏览器该联系哪台服务器,还告诉浏览器要获取该服务器上的哪个具体资源。MDN将URL定义为互联网上某个唯一资源的地址,浏览器用它来获取已发布的资源,例如HTML页面、图片或样式表。换句话说,域名只是URL内部的一个组成部分。完整的URL还包含协议方案、路径,以及可选的查询字符串和片段,每一部分都指向比服务器本身更具体的内容。2

本文使用一个假设地址来让这种区别变得具体:https://example.org/notes/first-page?view=compact#intro。这个地址纯粹为练习而编造,它不指向任何真实页面,也没有服务器会对它做出响应。我们只关心阅读这串字符并理解每个部分的含义。

在示例地址中标出每个部分

把完整地址写在一行空白处,将它分成五个可见的部分。第一部分是https,即协议方案,告诉浏览器请求资源时应使用哪种协议。第二部分是example.org,即域名,标识目标服务器。第三部分是/notes/first-page,即路径,将请求缩小到该服务器上某个特定位置或资源。第四部分从问号开始:view=compact,这是查询字符串,由传递给服务器作为额外参数的键值对组成。第五部分从井号开始:intro,这是片段,相当于资源内部的一个书签。2

两个标点符号值得特别注意,因为它们标示了各部分之间的边界。问号引导查询部分,问号与井号之间(如果存在井号的话)的所有内容都属于查询。井号引导片段,井号之后的所有内容都是片段标识符。MDN指出,片段永远不会随请求发送到服务器,它只告诉浏览器在返回的资源中滚动或聚焦到哪里。2

域名本身也有内部结构。在example.org中,org是从右向左读取的最后一个组成部分,即顶级域(TLD)。example是紧跟其前的标签。MDN将TLD描述为提供关于域名背后服务的目的或范围的一般信息,并指出完整的TLD列表由ICANN维护。13

保持主机不变,只改变路径和查询

现在保持示例中的主机部分不变。域名example.org和协议方案https在下面的每个变体中都保持一致,只改变路径和查询。看第二个地址:https://example.org/notes/second-page?view=compact#intro。路径从/notes/first-page变成了/notes/second-page,查询和片段完全相同。仅从字符串本身就能观察到,路径是区分同一服务器上不同资源的部分。你并没有推断服务器实际会如何处理这些路径,只是在阅读字符串所传达的信息。

接下来,保持路径不变,只改变查询。将https://example.org/notes/first-page?view=compact#intro与https://example.org/notes/first-page?view=full#intro对比。路径和片段没有变化,唯一的区别是键view所对应的值。这说明查询字符串携带的是可选参数,可以独立于路径而变化。同样,你描述的是字符串的结构,而不是预测某台特定服务器会如何响应这些参数。

最后,完全去掉片段:https://example.org/notes/first-page?view=compact。这个地址仍然有效,片段是可选的。你能观察到的是,井号及其后面的所有内容消失了,其余部分不受影响。这个练习表明,URL的每个部分都可以独立于其他部分而变化,仔细阅读字符串就足以识别哪个部分发生了改变。

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

为你计划使用的每个地址记录一张简短的说明卡。说明卡不需要多复杂,一个纯文本文件或笔记应用中的表格就足够了。对每个地址写下三样东西:用一句话说明页面的目的、完整地址的原样写法、以及各部分的标注分解。用我们的假设示例来说,目的可以写成:以紧凑布局显示的读书笔记页面。完整地址是https://example.org/notes/first-page?view=compact#intro。分解列出协议方案为https,域名为example.org,路径为/notes/first-page,查询为view=compact,片段为intro。

说明卡的价值在你需要向别人解释地址时会变得明显。设计师、内容协作者或未来的你自己,看到说明卡就能立刻明白字符串的哪个部分控制请求的哪个方面,不必每次从头推导结构。说明卡也更容易发现错误:如果卡上的路径与你在浏览器中看到的不一致,说明某处已经发生了偏差。

保持说明卡的格式简单且一致,适用于项目中所有地址。如果你有五个页面,就做五张卡,每张都有相同的三个字段。一致性比装饰更重要。统一的格式让你能快速浏览列表、并排比较地址,而不必在不同布局之间切换思路。

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

检查你的说明卡是否与实际字符串一致,方法是把地址逐字符复制到纯文本编辑器中。不要依赖记忆或截图。粘贴地址后,在每个边界前插入一个空格或可见标记:域名后第一个斜杠前、问号前、井号前。这样你就得到了一个可视化的分段,可以与说明卡上的标注进行对照。

在文本中直接标注每个片段。在对应部分旁边写上协议方案、域名、路径、查询或片段。然后对照说明卡上的字段阅读你的标注。如果任何标注与说明卡不一致,立即更正。这一步能捕捉常见错误,例如路径中缺少末尾斜杠、查询键拼写错误、或者片段被误写进了路径字段。

每次修改地址后都重复这个检查。即使是很小的改动,比如把页面从first-page改名为first-draft,也可能引入拼写错误,而当你专注于内容而非结构时很容易忽略。手工复制加标注的流程每个地址不到一分钟,却能防止那些只有在发布后才会暴露的不一致。

步骤 1

将完整地址从浏览器或笔记中复制到纯文本编辑器。

步骤 2

在每个结构边界前插入空格:域名之后、问号之前、井号之前。

步骤 3

在每个片段上方或旁边写上部分名称(协议方案、域名、路径、查询、片段)。

步骤 4

将行内标注与说明卡上的字段对比,修正任何不匹配之处。

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

把完成的说明卡保存在你已经用于项目笔记的地方。如果你维护项目日志,就添加一个地址部分。如果你使用wiki或共享文档,就创建一个专门的页面。目标是让参与项目的任何人都能在一个地方找到当前地址、它的目的和标注分解,而不必直接来问你。

每当你添加、重命名或删除页面时更新说明卡。把说明卡列表当作站点公开地址的动态索引。当协作者问为什么某个链接返回了意外结果时,你可以指向说明卡并识别字符串的哪个部分可能有问题。这比每次从头解释URL结构要高效得多。

你不需要记录查询参数或片段的每一种可能变体。记录你实际使用或计划公开分享的版本。如果某个地址是临时的或仅供内部使用,在说明卡上注明,让未来的读者知道它不是一个稳定的引用。这个简单的标注能防止工作草稿与已发布页面之间的混淆,也让你的文档诚实地反映哪些是定稿、哪些仍在进行中。

常见问题

域名和URL是同一回事吗?

不是。域名标识的是网络服务器,而URL是该服务器上某个具体资源的完整地址。URL始终包含域名,但还包括协议方案、路径,以及可选的查询字符串和片段。12

URL中的问号表示什么?

问号将路径与查询字符串分隔开。问号与井号之间(如果存在井号的话)的所有内容,是传递给服务器作为请求额外信息的键值对参数集合。2

片段会发送到服务器吗?

不会。片段即井号之后的部分,永远不会随请求发送到服务器。它只告诉浏览器在返回的资源中聚焦到哪里,例如滚动到页面上的某个特定标题。2