如果你正在准备第一个网站,地址栏里那一长串字符可能看起来只是一堆符号。本文用一个假设的完整地址做拆解练习,帮你分清域名和URL各部分的含义,并建立一份可以随时查阅的说明记录。

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

假设你正在搭建一个小型个人项目,在笔记本上写下了这个地址:https://example.org/notes/first-page?view=compact#intro。这串字符完全是为拆解练习而设的假设,并不声称该页面真实存在或已上线。练习的目的是在接触真实地址之前,先学会把各部分分开来看。域名回答的问题是:我在跟哪台服务器通信?而完整URL回答的问题更具体:我要的是那台服务器上的哪个资源、在什么条件下、定位到文档的哪个位置?12

域名是互联网基础设施的关键组成部分,它为互联网上任何可用的网络服务器提供了一个人类可读的地址。计算机之间通过公开的IP地址相互通信,但那些数字串对人来说很难记住,所以域名作为更友好的层覆盖在上面。在我们的例子中,example.org就是域名部分。它告诉你目标服务器是哪一台,但还没有指定你要哪个页面、哪种视图模式或页面的哪个段落。1

URL是统一资源定位符的缩写,它是互联网上某个唯一资源的地址,也是浏览器用来获取已发布资源的关键机制之一,这些资源包括HTML页面、CSS文档、图片等。理论上每个有效的URL都指向一个唯一的资源。所以当你把完整的假设字符串输入地址栏时,你请求的东西比仅仅指定服务器要精确得多——你在命名一个特定的文件路径、请求一种特定的视图模式,并指向结果文档中的一个特定位置。2

在本例中逐段标出各组成部分

把字符串 https://example.org/notes/first-page?view=compact#intro 在自然边界处拆开。方案部分是https,它告诉浏览器必须使用哪种协议来请求资源。权限部分紧跟在 :// 这个字符组合之后,包含域名 example.org。域名之后是路径 /notes/first-page,代表通往服务器上某个资源的路由。问号引出查询字符串 view=compact,井号引出片段标识符 intro。2

问号是一个分隔符,它告诉你其后的所有内容都属于查询部分。查询中的参数是键值对,网络服务器可以用它们在返回资源之前做额外处理。井号的作用不同:它标记的是资源本身内部的一个位置,而不是向服务器发送信息。片段标识符永远不会随请求发送给服务器,它只是告诉浏览器在已加载的文档中滚动或聚焦到哪里。2

注意域名 example.org 遵循一个简单的结构:各部分由点号分隔,从右向左阅读。最右边的部分是 org,即顶级域名。标签 example 位于其左侧。它们共同构成URL的主机部分。主机之后、从第一个斜杠开始的所有内容都属于路径、查询或片段,而不属于域名本身。保持这条边界清晰,有助于你在以后遇到带有子域名或多层路径的更长地址时不产生混淆。13

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

保持 example.org 不变,只改变路径。把 /notes/first-page 与 /notes/second-page 或 /archive/old-draft 对比。每一条都指向同一台服务器上的不同资源。主机没有变化,所以目标机器是同一台。变化的是你请求的是哪份文档或哪个端点。这就是核心区别:域名标识服务器,路径标识该服务器上的具体资源。

现在保持路径不变,只改变查询。字符串 /notes/first-page?view=compact 和 /notes/first-page?view=full 指向相同的路径,但要求服务器以不同方式呈现资源。你并不是在发明新规则,只是在观察问号如何把资源位置和附加指令分开。某台特定服务器是否真正处理某个参数取决于它自身的逻辑,所以阅读字符串告诉你的是正在请求什么,而不一定是实际会发生什么。

最后,只改变片段。把 #intro 替换成 #summary 或完全去掉片段,都不会改变服务器返回哪份资源。片段是浏览器在加载完成后定位视口位置的本地指令。这意味着两个仅在片段上不同的URL会加载同一份文档,但可能滚动显示到不同的段落。认识到这一点有助于你理解为什么分享一个带片段的链接能让对方直接跳到特定段落。

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

记录你的假设项目的用途,用一句话概括即可。对这个练习来说,你可以写:一个带有紧凑阅读视图的个人笔记页面。然后在下一行写出完整地址 https://example.org/notes/first-page?view=compact#intro。再往下,把每个组成部分各占一行:方案是 https,域名是 example.org,路径是 /notes/first-page,查询是 view=compact,片段是 intro。这张卡不是技术规范,而是一份用平实语言写的笔记,帮助你在讨论地址时不产生歧义。

写一小段说明,解释你为什么这样选择各部分。例如,你可以注明路径使用了描述性词语而不是数字编号,因为语义化URL使用本身带有含义的词语,无论技术背景如何都能被人理解。你选择查询参数 view=compact 是因为想要一个精简的显示选项。片段 intro 的存在是为了让分享的链接能把读者带到引言部分,而不是页面顶部。2

保持说明卡简短。每个组成部分一到两行就够了。目标是创建一份你在撰写内容、设置导航或向协作者解释地址时能快速扫一眼的参考。如果项目增长,你可以为其他页面添加更多卡片,但每张卡都应保持在一屏以内,这样它才保持有用,而不是变成另一份需要翻找的文档。

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

说明卡写好之后,下一步是把它和实际字符串逐字符对照。这是一个简单的手工过程,能在拼写错误、缺少斜杠或问号放错位置造成后续混乱之前把它们找出来。

检查原始字符串中的每个边界字符。确认冒号加双斜杠的组合恰好出现一次,位于方案和域名之间。确认域名之后的第一个单斜杠开始了路径部分。确认问号出现在查询之前,井号出现在片段之前。如果这些分隔符中有任何一个缺失或重复出现,说明你的卡片与实际地址不匹配。

把发现的差异直接记录在卡片上,而不是写在单独的笔记里。如果卡片上的路径写的是 /notes/firstpage 但实际字符串中有连字符即 /notes/first-page,立即更正卡片。像缺少连字符这样的小差异会改变所请求的资源,尽管乍看起来几乎一模一样。

步骤 1

把完整URL复制到一个纯文本编辑器中,这样你可以看到每个字符,不会被格式隐藏任何内容。

步骤 2

标注每个段落:在方案之前、域名之前、路径之前、查询之前和片段之前各插入一个换行。

步骤 3

将每个标注好的段落与说明卡上对应的行逐项比较,修正任何不匹配的地方。

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

把核对过的说明卡存放在你保存项目笔记的地方。一个纯文本文件、写作工具里的一条笔记、甚至桌面上的便利贴都可以。格式不如习惯重要——重要的是有一个固定位置让地址和它的拆解放在一起。以后你写文档、给协作者发邮件或排查失效链接时,打开卡片即可,不必凭记忆重新解析字符串。

自己决定卡片需要多少细节。如果你的项目只有一个页面,卡片可能只有三行。如果有多个页面带不同查询参数,你可以每页一张卡,或者用一个小表格列出来。重要的是保持一致:每次使用相同的组成部分标签,这样你自己或其他读卡片的人都能不靠猜测就找到路径、查询和片段。

随着时间推移,这个习惯会建立起一份反映你自己选择的个人参考。你并不是在遵循某种通用的卡片格式标准,而是在创建一份与你思考项目的方式匹配的轻量记录。如果以后有协作者加入,卡片能给他们和你一样清晰的拆解,降低有人把查询参数误读为路径的一部分、或忽略对深度链接有用的片段的可能性。

常见问题

片段标识符会随请求发送给服务器吗?

不会。井号后面的片段标识符永远不会随请求发送给服务器。它只是告诉浏览器在已加载的文档中滚动到哪个位置。2

同一个域名的两个URL可以指向完全不同的内容吗?

可以。域名标识的是服务器,但路径、查询和片段决定了你获得哪份具体资源以及该资源的哪种视图。改变其中任何一部分,即使域名不变,也可能得到不同的内容。2

上线之前需要理解所有可能的URL格式吗?

不需要。对于大多数个人网站或小型项目来说,了解方案、域名、路径、查询和片段就足够了。URL还有一些额外的规则和组成部分,但它们对普通用户或搭建功能完整网站的开发者来说并不相关。2