当你第一次准备个人网站或小型项目网站时,会遇到两个相关但不同的概念:域名和完整URL。把它们混为一谈可能导致在与合作者沟通或排查链接问题时产生误解。本文通过一个假设地址来展示网站地址的各个部分分别承担什么角色。

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

假设你正在搭建一个小型网站,用来发布设计课程的笔记。一位同事问你的作品在哪里可以找到。你可能会说网站在 example.org,但当对方在浏览器里输入这个域名时,到达的只是顶层页面。要找到某一篇具体笔记,你需要分享一个更长的地址。这个简单场景说明了核心区别:域名标识互联网上的一台服务器,而完整URL标识该服务器上的某个具体资源。12

域名之所以存在,是因为计算机之间通过IP地址通信,例如 192.0.2.172,这类数字串对人类来说很难记住,而且可能随时间变化。域名提供了一个人类可读的别名来代替这串数字。域名本身由多个部分组成,用圆点分隔,从右往左阅读,最右边是顶级域,左边是一个或多个标签。1

URL则不同,它是互联网上某个唯一资源的地址。URL包含域名,但还附加了关于使用哪种协议、服务器上哪条路径以及可选参数或锚点的信息。理论上每个有效URL指向一个唯一资源,不过实际中URL也可能指向已经不存在或已迁移的内容。3

逐部分阅读示例地址

为了看清这些部分如何组合在一起,来看下面这个纯粹用于说明的假设地址:https://example.org/notes/first-page?view=compact#intro。这个页面不需要真实存在或已上线;它只是一个我们用来拆解结构的字符串。开头的方案部分是 https,它告诉浏览器请求资源时应使用哪种协议。对于网站来说,协议通常是 HTTPS 或其未加密版本 HTTP。3

authority 部分紧跟在 :// 之后,在本例中是 example.org。这就是域名,指明应由哪台网络服务器来处理请求。紧随其后的是路径,这里是 /notes/first-page。路径指向服务器上的一个位置,不过如今它更多是服务器处理的一种抽象,而非磁盘上的实际文件位置。3

路径之后还出现了两个部分。问号引出查询字符串;在本例中查询是 view=compact,它是一个键值对,服务器可以用它来修改返回的内容。井号引出片段标识符;这里片段是 intro,作用相当于资源内部的书签,指示浏览器滚动到特定位置。值得注意的是,井号之后的片段部分不会随请求发送到服务器。3

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

现在保持地址的主机部分 example.org 不变,想象同一个假设网站的另外两个URL。第一个是 https://example.org/notes/second-page?view=compact#summary,第二个是 https://example.org/notes/first-page?view=full#intro。在这两种情况下域名都是 example.org,意味着请求仍然发往同一台服务器。变化的是路径,以及其中一种情况下的查询参数值。

将这些字符串并排比较可以看出,路径决定了请求的是服务器上的哪个资源。把 /notes/first-page 改成 /notes/second-page 就指向了站点结构中的另一个位置,尽管主机完全相同。把查询从 view=compact 改为 view=full 则保持路径不变,但要求服务器以不同方式呈现该资源。片段改变的是资源加载后浏览器滚动到页面的哪个位置。

这里需要说明的是,我们只是在观察字符串在结构上传达了什么。某台服务器是否真的会响应 view 参数,或者它如何处理不同路径,完全取决于那台服务器的配置方式。URL标准定义了每个部分在语法上的含义,但这些部分背后的行为由服务器所有者决定。

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

记录三样内容:地址的用途、完整URL字符串、以及各部分代表什么的简要说明。当你要把网站地址分享给合作者或写进文档时,一张简短的说明卡可以防止混淆。对于我们的假设示例,说明卡可以这样写:用途是链接到紧凑视图下的第一篇设计笔记,并滚动到引言部分。完整地址是 https://example.org/notes/first-page?view=compact#intro。

在地址旁边写下拆解结果。方案:https。主机:example.org。路径:/notes/first-page。查询:view=compact。片段:intro。把这份拆解放在完整字符串旁边,任何阅读说明卡的人都能立即看出每个部分的作用,而不必自己去解析字符串。

如果你的项目有多个页面需要分享,考虑为每个地址单独做一张卡,而不是写一条合并的笔记。图库页面的卡和设置页面的卡内容不同,分开存放让每张卡更容易独立验证。格式可以简单到一个纯文本文件或文档里的一张表格;关键是完整字符串和标记好的各部分放在一起。

手工核对说明卡

检查每个标记部分与完整字符串是否一致,方法是将URL复制到纯文本编辑器中,在每个分隔符前手动插入空格或换行。在 :// 之后断开以分隔方案和 authority。在主机后的第一个 / 处断开以标记路径起点。在 ? 处断开以隔离查询,在 # 处断开以隔离片段。这个手动练习能发现拼写错误或遗漏的分隔符,这些在快速浏览字符串时很容易被忽略。

记录你在说明卡和实际字符串之间发现的任何差异。如果卡上写的片段是 intro 但字符串实际是 #introduction,就更新其中一方使它们一致。这类小不匹配是链接失效的常见原因,因为有人可能复制的是卡上的描述而非实际URL。

在把地址粘贴到任何公开文档、邮件或链接列表之前执行这个核对步骤。它只花一点时间,但能确保你写下的内容正是读者将要输入或点击的内容。随着时间推移,这个习惯会减少发布后反复修正共享链接的情况。

保留地址记录供日后使用

一旦说明卡经过核对,就把它存放在你撰写内容或沟通网站时会自然查看的地方。有人会在项目文件旁边放一个专门的笔记文件;有人会在站点配置的顶部添加注释块。具体位置不如一致性重要:选定一个地方,每次先查那里。

如果项目增长、页面增多,就扩展卡片集合而不是重写。每张卡是某个地址在某个时间点的快照。如果路径或参数后来发生了变化,更新对应的卡并注明变更日期,这样你就能区分当前地址和旧地址。

当多人共同维护一个网站时,这种做法尤其有用。一份共享的卡片文件给所有人提供相同的参照,减少两位贡献者使用同一URL的不同版本的可能性。它在你中断一段时间后回到项目、需要回忆哪些地址指向哪里时也很有帮助。

常见问题

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

不是。域名标识互联网上的一台服务器,而URL是一个完整地址,包含域名以及方案、路径、可选查询和可选片段等附加部分。每个URL都包含域名,但单独的域名并不指定该服务器上的某个具体资源。13

URL中的问号起什么作用?

问号将路径与查询字符串分隔开。问号之后、井号之前的所有内容都是查询部分,由键值对组成,服务器可以用它来修改返回的响应。3

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

不会。片段标识符即井号之后的部分,不会随请求发送到服务器。它仅由浏览器用来在已加载的资源中导航到特定位置。3