当你第一次准备网站时,地址栏里那串字符看起来像一整块没有分隔的符号。知道每一段的作用,能帮助你向合作者描述站点、排查链接问题,并让自己的笔记保持条理。本文用一个假设地址逐步拆解每个组成部分。

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

假设你正在搭建一个小型个人项目,有人问你在哪里能找到它。你可能回答一个简短的名字,比如example.org,也可能递出一串更长的地址,比如https://example.org/notes/first-page?view=compact#intro。两者都是有用的回答,但它们回应的是不同的问题。短名字告诉对方该连接哪台服务器,长地址则告诉浏览器在那台服务器上具体取回哪个资源,甚至显示到资源中的哪个位置。

域名之所以存在,是因为互联网上的计算机通过数字IP地址来标识,而这些地址对人来说难以记忆,并且可能随时间变化。域名为网络服务器提供了一个人类可读的地址,使任何人都能方便地输入或分享。域名由点号分隔的若干部分组成,从右向左阅读,最右边的部分是顶级域,它对该名称背后的服务给出一般性提示。1

URL则更进一步。它是互联网上某个唯一资源的地址,也是浏览器用来获取已发布资源的关键机制之一,这些资源包括HTML页面、图片或样式表等。域名指向一台服务器,而完整URL指向该服务器上的某个具体条目,还可以包含关于如何呈现该条目的指示。理解这一区别是本文其余内容的基础。2

在本例中标出各组成部分

为了让每个部分变得具体,本文自始至终使用同一个假设字符串:https://example.org/notes/first-page?view=compact#intro。这个地址纯粹为了拆解结构而编造,它不指向任何真实页面,本文也不假设它已上线或曾经发布过。

从左向右阅读,第一部分是方案。在本例中是https,它告诉浏览器请求资源时应使用哪种协议。接下来是权限部分,由字符组合://引出。在本例中权限就是域名example.org,它标识被请求的网络服务器。域名本身还可以进一步拆分:org是顶级域,example是紧接在它前面的标签,有时也称为二级域名。23

域名之后是路径,在本例中为/notes/first-page。路径标识浏览器应向服务器请求哪个资源。路径之后,问号引出查询字符串。本例中查询为view=compact,它是一个键值对,向服务器提供额外参数。最后,井号引出片段标识符,本例中为intro。片段相当于资源内部的一个书签,指示浏览器滚动到文档中的特定位置。值得注意的是,片段不会随请求发送给服务器,它完全由浏览器处理。2

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

现在保持主机部分example.org不变,只改变路径。如果地址变为https://example.org/gallery/photos,域名和方案完全相同,但路径指向了该服务器上的另一个位置。浏览器将请求不同的资源,尽管它联系的是同一台机器。这说明路径是在域名之上叠加的一层独立的具体性。

接下来,保持主机和路径不变,只改变查询字符串。比较https://example.org/notes/first-page?view=compact与https://example.org/notes/first-page?view=full。两个地址指向同一路径上的同一资源,但查询参数不同。服务器可能利用该参数调整呈现方式,不过具体行为完全取决于服务器自身的配置。仅从地址字符串本身,你只能观察到参数发生了变化,无法判断服务器实际会如何处理。

最后看片段。如果把#intro改为#summary而其余部分保持不变,发送给服务器的请求完全相同。只有浏览器端的行为会改变,因为片段告诉浏览器在已接收的文档中滚动到哪里。当你比较两个看起来几乎一样的地址时,这是一个有用的区分:井号之后的差异并不意味着服务器看到了不同的请求。

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

开始一个新站点时,为计划使用的每个地址写一张简短的说明卡会很有帮助。对于我们的假设项目,卡片可以这样写。目的:一个以紧凑布局显示的个人阅读笔记页面,滚动到引言部分。完整地址:https://example.org/notes/first-page?view=compact#intro。方案:https。域名:example.org。路径:/notes/first-page。查询:view=compact。片段:intro。

写卡片会迫使你思考每个部分各自贡献了什么。如果之后决定不需要紧凑视图,可以移除查询并更新卡片。如果在/notes/second-page新增第二个页面,就创建一张新卡片,路径不同但域名相同。卡片格式让记录保持一致,也便于发现两个地址版本之间究竟哪一段发生了变化。

这不需要任何特殊工具。一个纯文本文件、一行电子表格、或你常用笔记应用中的一条记录都可以。重要的是每个字段单独标注,而不是埋在一整串未分隔的字符里。当你之后需要向合作者解释地址或将其粘贴到配置文件中时,各部分已经分开能节省时间并减少复制错误。

手工核对说明卡

标注完整地址中的每个分界位置。将说明卡上的完整地址复制到一行空白文本中,然后从左到右依次标记:在https之后标一个分隔,在example.org之后标一个分隔,在问号之前和井号之前各标一个分隔。最终应得到五个清晰标注的片段,与说明卡上的五个字段一一对应。

检查每个片段是否与说明卡上的字段一致。确认方案字段写的是https,且字符串确实以这个序列开头。确认域名字段与://和下一个斜杠之间的字符完全匹配。确认路径字段包含开头的斜杠以及到页面名称为止的每一级目录名。确认查询字段只包含问号与井号之间的文字,片段字段只包含井号之后的文字。

记录执行核对的日期,写在说明卡旁边。如果之后修改了地址,重新核对并更新日期。这个简单习惯能发现常见错误,比如缺少斜杠、问号位置放错、或片段被误写进查询字段。这些步骤不需要专业软件,只是对一小段字符串的仔细检查。

保留记录供日后写作与沟通使用

说明卡核对完成后,把它存放在你真正会查看的地方。如果你把项目笔记集中在一个文档里,将卡片放在靠近顶部的位置。如果你使用任务看板或维基,把它固定在相关页面上。目标不是建立一套精密系统,而是确保下次你或合作者需要这个地址时,标注好的分解立即可用,不必凭记忆重新推导。

撰写文档、教程或支持消息时,从卡片上粘贴完整地址,而不是凭回忆输入。这能减少引入拼写错误从而改变地址含义的机会。如果你只需在对话中提及域名,可以从卡片中提取那一个字段,不必担心是否意外带上了末尾斜杠或查询参数。

随着时间推移,你可能为不同页面或不同项目积累多张卡片。这完全没问题。卡片格式天然可扩展,因为每张卡片都是自包含的。你可以按时间顺序排列、按项目分组、或按域名归类。唯一的要求是每张卡片保持准确,并在底层地址发生变化时及时更新。一份小而诚实的记录,比一份大而过时的记录更有用。

常见问题

片段部分会发送给服务器吗?

不会。片段标识符即井号之后的文字,完全由浏览器处理,不会包含在发送给服务器的请求中。它只告诉浏览器在已接收的文档中滚动或跳转到哪个位置。2

修改查询字符串会不会改变请求的资源?

不会改变资源位置。查询字符串随请求提供额外参数,但路径才是标识资源的部分。两个域名和路径相同但查询值不同的地址指向同一个资源位置;服务器可能利用参数调整响应方式,但那取决于服务器自身的配置。

上线前需要掌握所有URL规则吗?

不需要。URL标准包含本文涉及的方案、域名、路径、查询和片段之外的额外部分和规则,但那些内容对普通用户或搭建功能站点的开发者来说并不相关。了解五个主要部分及其阅读方式,对大多数上线前的规划已经足够。2