在网站上线之前,地址会出现在规划笔记、设计稿和与协作者的对话中。理解地址各部分的含义有助于清晰沟通并避免混淆。本文用一个假设URL逐步拆解域名与完整URL的区别,然后演示如何标注、对比和记录地址各部分。

域名与完整URL分别回答什么问题

假设你正在规划一个小型个人项目,为笔记页面草拟了一个网址:https://example.org/notes/first-page?view=compact#intro。这是一个仅用于练习阅读URL字符串的假设地址,并不指向真实已上线的页面。即使你还没有搭建任何东西,也已经可以对这个字符串提出两个不同的问题。第一个问题是:互联网上哪台服务器应当处理我的请求?第二个问题是:我想要该服务器上的哪个具体资源,以及应在什么条件下展示它?

域名回答的是第一个问题。域名是互联网基础设施的关键组成部分,因为它们为互联网上任何可用的网络服务器提供了人类可读的地址。计算机通过IP地址通信,而IP地址对人类来说难以记忆且可能随时间变化,因此域名为我们提供了一个稳定、可读的标签来指向某台服务器。在我们的例子中,example.org就是域名。它告诉浏览器应当联系哪台服务器,但并没有说明你想要该服务器上的哪个页面或文件。1

完整URL回答的是第二个问题。URL是互联网上某个唯一资源的地址,也是浏览器用来获取已发布资源(如HTML页面、图片或文档)的关键机制之一。理论上,每个有效的URL都指向一个唯一的资源。我们的示例字符串是一个完整的URL:它指定了服务器名称、给出了通往特定页面的路径、添加了一个查询参数,并包含了一个片段标识符。域名只是这个更大地址中的一个组成部分。2

在本例中标出地址的各个组成部分

现在取同一个假设字符串,逐一标出各组成部分。方案(scheme)是https,表示浏览器请求资源时必须使用的协议。权限(authority)部分包含域名example.org。路径是/notes/first-page,代表网络服务器上的一个位置。问号引出查询字符串view=compact,井号引出片段intro。这两个标点符号充当代隔符:问号表示其后的所有内容都是发送给服务器的参数集合,井号表示其后的所有内容都是资源内部的书签位置。2

域名本身也有内部结构。顶级域名(TLD)是域名的最后一个组成部分。在example.org中,org就是TLD。紧接在TLD前面的标签称为二级域名。这些标签组合在一起构成一个完全限定域名,再加上类似https://这样的方案前缀,结果就是一个完整的URL。理解这种嵌套关系有助于你看到域名并不是一个扁平的单词,而是一个从右向左阅读的层级结构。31

查询和片段值得特别关注,因为它们的行为方式不同。问号之后的参数会作为请求的一部分发送给服务器,服务器可以利用它们来修改返回的内容。然而井号之后的片段永远不会随请求发送给服务器。它充当资源内部的书签,告诉浏览器滚动到某个特定位置。当你规划链接或调试页面显示与预期不符的原因时,这个区别非常重要。2

保持主机不变,对比不同路径和查询字符串

保持示例中的主机部分example.org不变,只修改路径。如果写成https://example.org/notes/second-page,域名完全相同,但路径指向服务器上的另一个位置。浏览器会把请求发送到同一台服务器,但它请求的资源不同。你可以把域名想象成建筑物的地址,把路径想象成该建筑内的房间号。

现在保持路径不变,只修改查询字符串。对比https://example.org/notes/first-page?view=compact和https://example.org/notes/first-page?view=full。两个地址指向同一台服务器上的同一路径,但携带了不同的参数值。服务器可能利用这些参数来决定如何呈现资源,不过具体行为完全取决于该服务器的配置方式。仅从URL字符串本身,你可以观察到请求了什么,但无法确定服务器会如何响应。

最后,只修改片段。对比https://example.org/notes/first-page?view=compact#intro和https://example.org/notes/first-page?view=compact#summary。两种情况下服务器收到的请求完全相同,因为片段永远不会被传输。区别纯粹是客户端指令:浏览器会滚动到同一文档内的不同位置。识别这一规律有助于你理解为什么地址栏中看起来不同的两个URL可能产生相同的服务器响应。

为假设项目制作地址说明卡

记录一张简短的说明卡来描述你的假设项目地址。说明卡应包含三项信息:用平实语言描述页面用途、完整的URL字符串,以及各组成部分的标注分解。对于我们的例子,用途可以写成「首个笔记页面的紧凑视图,滚动到引言部分」。完整URL是https://example.org/notes/first-page?view=compact#intro。分解结果为:方案是https,域名是example.org,路径是/notes/first-page,查询是view=compact,片段是intro。

将这张说明卡写成方便复制到其他文档中的格式。一个简单的两列表格就很实用:一列写组成部分名称,另一列写该部分在你具体地址中的值。如果你正在与协作者合作,分享这张说明卡可以消除对话中各自指代地址哪一部分时产生的歧义。说明卡还可以充当你后续在站点内容中配置链接时的核对清单。

决定是否在说明卡中包含片段。如果片段只是方便你自己阅读的标记,并不影响服务器返回的内容,你可以单独注明,比如写上「客户端书签,不发送给服务器」。这条简短的备注能防止日后有人疑惑为什么去掉片段后页面内容没有变化。

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

将完整URL字符串复制到一个纯文本编辑器中,在每个片段上方手动标注名称。从左侧开始:将https标为方案,将example.org标为域名,将/notes/first-page标为路径。遇到问号时,将其后直到下一个分隔符之前的内容标为查询。遇到井号时,将剩余部分标为片段。这个手工标注练习不到一分钟就能完成,却能发现快速阅读时容易遗漏的转录错误。

检查你标注的各片段是否与上一步制作的说明卡一致。逐字符比较每个组成部分的值。特别注意斜杠、问号和井号,因为遗漏或放错一个分隔符会改变其后所有内容的含义。如果说明卡上的任何片段与文本编辑器中的字符串不匹配,先修正说明卡再将其用于规划文档或对话。

每次修改地址后都重复这个核对过程。如果你新增了一个查询参数或更改了路径,重新走一遍标注流程,而不是假设字符串的其余部分没有变化。尽早养成这个习惯意味着当项目扩展到包含许多页面时,每张地址说明卡仍然可靠,无需从头重新阅读整个URL。

保留这份记录供以后使用

将地址说明卡与其他项目规划笔记放在一起保存。具体的存放位置是个人选择:项目文件夹中的markdown文件、wiki中的笔记或共享文档都可以。重要的是说明卡存放在你写链接、向他人解释地址或排查页面加载异常时能找到它的地方。

当你最终搭建真实站点时,更新说明卡以反映实际使用的域名和路径。说明卡的结构保持不变,只有具体数值会改变。因为你已经用假设示例练习过标注流程,将方法迁移到真实地址是很直接的。你已经知道哪些标点符号分隔哪些组成部分,所以可以专注于确保具体数值的正确性。

考虑在每张说明卡上添加一条简短备注,解释你为什么选择了特定的路径结构或查询参数。这些备注不是技术要求,而是给未来自己的提醒。一句类似「我选择/notes/作为基础路径,因为所有笔记页面都会放在这个目录下」的话,能让你在数月后原始上下文已经淡忘时不必重新推导当初的理由。

常见问题

URL中的片段部分会发送给网络服务器吗?

不会。片段标识符即井号之后的部分,永远不会随请求发送给服务器。它只是客户端指令,告诉浏览器在已加载的资源内滚动到哪个位置。2

域名和URL的区别是什么?

域名标识应当联系哪台服务器,而URL是一个完整的地址,包含方案、域名、路径以及可选的查询和片段。域名是URL内部的一个组成部分。12

修改查询字符串一定会改变页面内容吗?

不一定。查询参数会发送给服务器,但服务器如何使用它们取决于自身的配置。两个携带不同查询值的URL可能返回相同的内容,如果服务器忽略或以相同方式处理那些参数的话。2