在发布网站之前,你会遇到两个相关但不同的概念:域名和完整URL。混淆它们可能导致与协作者沟通出错,或在设置链接时产生问题。本文用一个假设地址来展示每个部分的含义,并演示如何清晰地记录它。

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

假设你正在准备一个小型个人项目网站,想把某个特定页面分享给朋友。你在浏览器地址栏输入了一串字符,但每个部分究竟在做什么?域名回答的是一个基本问题:浏览器应该联系互联网上的哪台服务器?它为原本是一串数字的IP地址提供了一个人类可读的标签,因为计算机处理数字地址很容易,但人们很难记住。完整URL回答的是一个更广泛的问题:应该从该服务器上获取哪个具体资源,以及在什么条件下获取。12

为了具体说明,请看下面这个假设地址:https://example.org/notes/first-page?view=compact#intro。这个地址并不指向任何真实存在或已发布的页面,它纯粹是为了让我们标注每个片段并理解其作用而构造的。在本文余下部分中,请将它视为一个练习字符串。

以这个例子来看,域名部分是example.org,它告诉浏览器应该访问哪台服务器。字符串中的其余部分则进一步限定要向该服务器请求什么内容以及如何呈现结果。这个区别很重要,因为你可能控制着一个域名,但其上的路径、查询和片段会随着你添加或重新组织内容而频繁变化。12

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

第一个片段https是协议方案,它指示浏览器必须使用哪种协议来请求资源。对于网站来说,协议通常是HTTPS或其未加密版本HTTP。协议方案后面总是紧跟字符组合://,将其与地址的下一部分分隔开。2

下一个片段example.org是主机部分。在本例中它是一个域名,用于标识Web服务器。圆点将标签example与顶级域org分隔开。顶级域是域名的最后一个组成部分,通常可以作为该域名背后服务用途或类别的线索。13

主机之后是路径:/notes/first-page。路径表示资源在Web服务器上的位置。在早期,路径对应服务器上的实际文件位置,但现在它主要是由Web服务器处理的一种抽象,不再具有物理实体含义。路径后面的问号引入查询字符串:?view=compact。查询参数是提供给Web服务器的额外键值对,服务器可以利用它们来调整返回的内容。最后,井号引入片段:#intro。片段是资源内部某个特定位置的锚点。值得注意的是,井号后面的部分不会随请求一起发送到服务器。2

保持主机不变,对比不同的路径和查询

现在保持主机部分example.org不变,只改变路径。将https://example.org/notes/first-page与https://example.org/gallery/summer-2024进行比较。主机完全相同,意味着浏览器联系的是同一台服务器,但路径指向了不同的资源位置。这就是一个域名能够对应多个不同页面而无需为每个页面单独使用一个域名的原因。2

接下来,保持主机和路径都不变,只改变查询字符串。将https://example.org/notes/first-page?view=compact与https://example.org/notes/first-page?view=full进行比较。路径没有变化,所以浏览器仍然请求相同的资源位置,但查询参数暗示了不同的展示或筛选选项。服务器实际如何处理该参数完全取决于服务器的配置;仅凭URL字符串本身并不能保证任何特定行为。2

最后,只将片段从#intro改为#summary,并不会改变浏览器向服务器发送的请求内容,因为片段不会随请求一起发送。片段的作用是告诉浏览器在资源加载完成后应该滚动或聚焦到哪个位置。通过观察字符串中这些差异,你可以在不需要访问实际服务器的情况下理解每个部分各自控制什么。2

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

记录这个地址的用途,用一句简短的话概括。对于我们的假设示例,你可以这样写:“这是我的第一篇笔记页面的紧凑阅读视图,滚动到引言部分。”保持用途描述简洁明了,有助于你日后核实地址是否仍然符合最初的意图。

列出完整的地址,单独占一行,确保它与预期完全一致:https://example.org/notes/first-page?view=compact#intro。在下方逐条列出每个部分及其简短标签。协议方案:https。主机:example.org。路径:/notes/first-page。查询:view=compact。片段:intro。这种说明卡格式让你可以快速查阅,也方便分享给协作者,或在数月之后重新审视时无需重新推导拆解过程。

如果你的项目最终会有多个页面,可以为每个地址各建一张说明卡。随着时间推移,这些卡片会形成一份简单的清单,展示你已经规划了哪些路径、依赖哪些查询参数、使用哪些片段进行页内导航。格式完全由你自己决定,关键在于每张卡片都将地址拆解为独立的部分,而不是只呈现一串原始字符串。

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

检查你写下的地址是否与说明卡一致,方法是将完整字符串复制到一个纯文本编辑器中,然后在每个边界处手动插入换行。在://之后插入一个换行,在主机之后插入一个,在问号之前插入一个,在井号之前插入一个。最终你应该得到五行,分别对应协议方案、主机、路径、查询和片段。

标注每一行的部分名称,然后与说明卡上的标签进行对照。如果某个片段缺失或位置放错,换行会立即暴露出问题。例如,如果你不小心遗漏了问号,查询字符串就会附着在路径后面,不匹配之处一目了然。

每当你从文档、聊天消息或设计稿中复制地址时,都可以使用这种手工核对方法。复制过程中容易引入多余空格、缺失斜杠或字符错位等风险。快速的换行验证能在地址进入正式环境之前发现这些问题。这是个人工作流建议,并非任何规范的要求。

保留这份记录供以后使用

将你的地址说明卡存放在你经常查阅的地方,比如项目说明文件、笔记应用或网站仓库中的一个简单文本文件。目标是降低查阅的摩擦,以便你在需要为新页面编写链接、与协作者分享URL或排查链接为何未按预期工作时能快速找到相关信息。

当项目逐渐扩大时,你可能会发现一些地址发生了变化。路径可能被重新组织,查询参数可能被重命名,片段可能被移除。因为每张说明卡都同时记录了用途和完整字符串,你可以快速判断哪些卡片需要更新、哪些仍然有效。这比在一长串没有上下文的原始URL中逐条搜索要简单得多。

本文描述的记录方式是基于一般组织实践的作者建议。你可以自由调整格式,添加诸如最后核对日期之类的字段,或按网站板块对卡片进行分组。最重要的是保持各部分的拆解清晰可见,这样下次你或其他人阅读这个地址时,每个片段都能被立即辨认出来。

常见问题

域名和URL是同一回事吗?

不是。域名用于标识服务器,而完整URL除了包含域名之外,还包括协议方案、路径、查询和片段等部分,用以指定应获取哪个具体资源以及如何呈现它。12

修改URL中的片段会向服务器发送不同的请求吗?

不会。片段即井号后面的部分,不会随请求一起发送到服务器。它只是告诉浏览器在已加载的资源中应该聚焦到哪个位置。2

一个域名可以对应多个不同的页面吗?

可以。URL中的路径部分使得一个域名能够指向多个不同的资源。你不需要为网站上的每个页面都使用一个单独的域名。2