在你准备发布网站之前,会遇到两个容易混淆的概念:域名和URL。它们看起来相似,但回答的是不同的问题。本文通过拆解一个假设的地址字符串,帮助你理解每个部分的作用,并学会用一张说明卡记录它。

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

域名之所以存在,是因为互联网上的计算机通过数字形式的IP地址来互相访问,而这些数字串对人来说既难记忆又可能随时变化。域名为网络服务器提供了一个人类可读的地址,让访问者可以输入有意义的名称而不是一串数字。域名由若干部分组成,用点号分隔,从右向左阅读,最右边的顶级域名提供了关于该名称背后服务用途的一般线索。1

URL,即统一资源定位符,在此基础上更进一步。它是互联网上某个唯一资源的地址,不仅包含域名,还包含协议方案、路径,以及可选的参数和锚点。理论上每个有效的URL指向一个唯一的资源。协议方案告诉浏览器使用哪种协议,权限部分指明服务器,其余部分则进一步缩小到该服务器上的具体资源。2

为了让这些概念变得具体,本文使用一个假设地址:https://example.org/notes/first-page?view=compact#intro。这个地址纯粹用于演示拆解过程,它不是一个真实存在的页面,也不需要实际解析到任何地方。我们将把它当作一个待分析的字符串,让每个组成部分变得可见且可命名。

在本例中标出各组成部分

在我们的示例中,第一个标记是https。这是协议方案,指示浏览器必须使用哪种协议来请求资源。对于网站来说,协议通常是HTTPS或其未加密版本HTTP。协议方案后面总是跟着分隔符://,然后才是下一部分的开始。2

紧跟在分隔符之后的是example.org。这是域名,即服务器的人类可读标识符。它由两个用点号分隔的标签组成:标签example和顶级域名org。顶级域名是域名的最后一个组成部分,提供了关于服务用途的一般线索。13

域名之后是/notes/first-page。这是指向网络服务器上资源的路径。在现代实践中,路径主要是由网络服务器处理的抽象概念,而非字面上的文件位置,但它仍然告诉服务器正在请求哪个资源。接下来是?view=compact。问号标志着参数部分的开始。这里有一个键值对:键是view,值是compact。参数是提供给网络服务器的额外信息,多个键值对之间用和号分隔。最后,#intro标记了锚点,也称为片段标识符。井号总是引导这一部分。片段永远不会随请求发送给服务器;它给浏览器提供指引,让其显示资源内部某个书签位置的内容。2

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

保持协议方案和域名不变,观察当只有路径或查询字符串不同时会发生什么。地址https://example.org/notes/first-page?view=compact#intro和地址https://example.org/notes/second-page?view=compact#intro共享相同的主机,但指向不同的路径。字符串/notes/second-page标识了一个与/notes/first-page不同的资源位置,尽管其他所有组成部分完全相同。

现在只改变查询字符串:https://example.org/notes/first-page?view=full#intro。路径相同,但参数值从compact变为full。仅从字符串本身就能观察到,传递给服务器的值不同了。服务器实际如何处理这个值完全取决于服务器自身的规则,这些规则在地址中不可见。URL标准只保证参数部分承载键值对,并不规定任何特定服务器如何解释它们。2

最后,完全移除片段:https://example.org/notes/first-page?view=compact。井号和intro这个词消失了。因为片段永远不会随请求发送给服务器,移除它不会改变服务器接收到的内容。它只改变浏览器是否尝试在返回的资源中滚动到某个书签位置。这些微小的变化表明,字符串的每个部分都承担着不同的角色,改变其中一个部分不一定会影响其他部分。2

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

在写下任何地址组成部分之前,先用一句简短的话记录你的假设项目的目的。对于这个练习,目的可以是:一个个人笔记页面,以紧凑视图显示第一篇条目。先写下目的有助于你之后检查地址的每个部分是否确实服务于该目标。

接下来,将完整地址单独写在一行上,与你希望它呈现的样子完全一致: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上方写路径,在view=compact上方写查询,在intro上方写片段。将这些标注与说明卡上记录的对照。如果任何标注不匹配,先修正说明卡再继续。

对说明卡上的每一个地址重复这个标注练习。重复能建立对结构的熟悉感,而手工操作而非依赖自动工具意味着你会注意到细微差异,比如末尾多出的斜杠、缺失的参数或意外遗漏的片段。这是普通的作者实践,不是技术要求,但能在错误还容易修复的时候及早发现它们。

保留记录供日后使用

将你的地址说明卡存放在你经常查看的位置,比如项目说明文件或专门的笔记文件夹。说明卡的价值不在于创建它的那一次,而在于当你撰写文档、与协作者分享链接或排查页面为何未按预期加载时,它随时可用。

当你的项目增长时,每次添加或重命名页面都更新说明卡。把说明卡当作一份活的清单。如果你删除了某个页面,在卡上注明,以免意外链接到一个已不存在的资源。URL标准承认,在实践中有些URL指向的资源已经移动或消失,服务器所有者负责管理这些变化。2

记录你选择某个路径名称或查询参数的原因也很有用。例如,记下view=compact是为了在小屏幕上减少视觉杂乱,这能为未来的你或协作者提供决策背后的理由。这些简短的注释把一份简单的地址列表变成一个轻量级的设计记录,支持沟通而无需正式的规格文档。

常见问题

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

不是。域名用人类可读的名称标识服务器。URL包含域名,但还添加了协议方案、路径以及可选的参数和片段,使其成为特定资源的完整地址。12

URL中井号后面的片段会发送给服务器吗?

不会。片段标识符出现在井号之后,永远不会随请求发送给服务器。它只告诉浏览器在返回的资源内部滚动或定位到哪里。2

能不能只改查询参数而不影响路径?

可以。URL字符串中每个部分是独立的。你可以在保持协议方案、域名、路径和片段完全不变的情况下修改查询值。服务器如何处理新值取决于它自身的规则。2