首次准备网站时,你会很快遇到两个相关但不同的概念:域名和完整URL。理解它们各自的作用以及如何组合在一起,有助于你在沟通项目地址时避免混淆。

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

域名回答的是一个具体问题:我们在谈论哪台服务器或哪个站点?域名是互联网基础设施的关键组成部分,因为它们为互联网上任何可用的网络服务器提供了人类可读的地址。计算机通过IP地址(例如192.0.2.172)进行通信,但人们很难记住这些数字序列,也很难将它们与某个站点的用途联系起来。像example.org这样的域名解决了这个问题,它为服务器提供了一个人类可以阅读、输入和记忆的名称。1

完整URL回答的是一个更广泛的问题:我想要的资源究竟在哪里,浏览器应当如何获取它?URL(统一资源定位符)是互联网上唯一资源的地址,也是浏览器用来获取已发布资源(如HTML页面、CSS文档和图片等)的关键机制之一。域名指向服务器,而完整URL在此基础上增加了关于请求哪个具体页面或文件、包含哪些额外指令以及在页面中查看哪个位置的信息。2

为了让这个区别更具体,我们使用以下仅用于练习的假设地址:https://example.org/notes/first-page?view=compact#intro。这个地址不需要作为真实页面存在,我们只用它来识别URL中各个独立的组成部分。其中域名部分是example.org,字符串中的其余部分则进一步指定了资源、参数和页面内的位置。记住这个例子,后续各节都会围绕它展开。12

在本例中标出各组成部分

我们示例地址的第一部分是https,即协议方案。协议方案指示浏览器在请求资源时必须使用的协议。对于网站来说,协议通常是HTTPS或其未加密版本HTTP。在我们的假设字符串中,https告诉浏览器在获取后续内容时使用安全连接。2

在协议方案和分隔符://之后,是权限部分。在本例中,权限就是example.org,即标识网络服务器的域名。域名指明正在请求哪台网络服务器。端口号也可能出现在这里,用冒号分隔,但当使用标准端口时端口通常被省略。由于我们的示例使用HTTPS及其标准端口,所以看不到端口号。2

域名之后是路径:/notes/first-page。路径指向网络服务器上的资源,告诉浏览器正在请求哪个具体页面或文件。在早期互联网中,这样的路径代表服务器上的实际文件位置;如今它主要是由网络服务器处理的抽象标识,不再对应真实的物理文件,但字符串仍然作为特定资源的标识符发挥作用。2

查询、片段及其区别

示例中路径之后是查询字符串,由问号引导:?view=compact。参数是提供给网络服务器的额外信息,格式为以&符号分隔的键值对列表。网络服务器可以使用这些参数在返回资源之前进行额外处理。在我们的假设案例中,view=compact是一个单独的键值对。我们并不声称任何真实服务器会以特定方式解释这个参数,只是识别它在字符串中的结构角色。2

示例的最后一部分是片段,由井号引导:#intro。锚点相当于资源内部的一个书签,为浏览器提供方向,使其显示位于该书签位置的内容。在HTML文档中,浏览器会滚动到锚点所定义的位置。值得注意的是,井号之后的部分(也称为片段标识符)永远不会随请求发送到服务器。这意味着片段只影响浏览器在本地显示的内容,而不影响服务器返回的结果。2

总结结构标记:问号始终引导查询部分,井号始终引导片段部分。这两个符号充当字符串内的边界。如果你在地址中看到问号,从问号到下一个井号(或字符串末尾)之间的内容都属于查询。如果你看到井号,其后的所有内容都是片段。识别这些边界有助于你阅读任何URL并理解每个部分的作用。2

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

现在保持示例的主机部分example.org不变,只改变路径和查询。如果路径从/notes/first-page变为/notes/second-page,字符串将指向同一服务器上的不同资源。域名没有变化,浏览器仍然联系同一台网络服务器,但请求的是不同页面。这说明路径如何在单个站点内缩小定位范围。2

如果将查询从?view=compact改为?view=full,路径和域名保持不变,只有传递给服务器的指令不同。每台网络服务器对参数有自己的规则,了解特定服务器是否处理参数的唯一可靠方式是询问该服务器的所有者。因此仅从字符串本身,我们可以观察到查询不同,但无法确定服务器实际会如何处理这种差异。2

如果将片段从#intro改为#summary,服务器收到的请求完全相同,因为片段永远不会发送到服务器。唯一变化的是浏览器在加载页面后将读者定位到的位置。这个区别值得记住:查询参数可能影响服务器返回的内容,而片段只影响浏览器在本地显示的内容。保持主机不变并变换其他部分,能帮助你清楚地看到字符串每个部分各自贡献了什么。2

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

记录以下信息,为你的假设项目制作一张简单的说明卡。用一句话写下页面的用途,例如“第一个笔记页面的紧凑阅读视图”。然后写下完整地址:https://example.org/notes/first-page?view=compact#intro。在下方列出每个部分及其标签:协议方案为https,域名为example.org,路径为/notes/first-page,查询为view=compact,片段为intro。这张说明卡为你提供了一个可以分享给协作者或日后回顾的单一参考点。

检查说明卡上的每一项是否与原始字符串一致,方法是将地址逐字复制到纯文本编辑器中。从左侧开始,识别协议方案直到://分隔符。然后识别域名直到权限之后的第一个正斜杠。继续标记路径直到问号,查询直到井号,片段从井号到末尾。如果说明卡上的任何部分与复制的字符串不完全匹配,先修正说明卡再继续。

标注每个部分旁边写上简短说明,解释你为什么选择这个值。例如在路径旁可以写“notes是栏目文件夹,first-page是文章标识”。在查询旁可以写“compact是我测试时想用的显示模式”。这些说明是你自己的组织选择,不是任何规范强加的规则。它们的作用是在你数周或数月后回到项目时,帮助你回忆当时的思路。

步骤 1

将完整的假设地址复制到纯文本文档中,获得一个无格式参考。

步骤 2

通过定位://序列,标出协议方案与权限之间的边界。

步骤 3

通过定位域名之后的第一个正斜杠,标出权限与路径之间的边界。

步骤 4

通过定位问号,标出路径与查询之间的边界。

保留说明供以后使用

说明卡完成并核对后,将它存放在你自然会回顾的地方。有人习惯在项目文件夹中放一个纯文本文件,有人偏好笔记应用或共享文档。格式不如习惯重要,关键是养成将地址与其用途及各部分理由一起记录的习惯。日后撰写内容、与协作者分享链接或设置重定向时,这份记录能省去你从记忆中重新推导结构的麻烦。

将说明卡用作与他人讨论项目时的沟通工具。如果协作者询问某个页面地址的含义,你可以直接指向说明卡,而不必从头解释字符串。当项目增长到包含多个路径相似但查询或片段不同的页面时,这一点尤其有用。清晰的记录能防止看起来几乎相同但指向不同资源的地址之间出现混淆。

每当站点结构发生变化时,回顾并更新你的说明卡。如果你重命名了路径中的某一段、新增了查询参数或移除了片段,请同时更新说明卡。这使你的文档保持准确,减少分享过时地址的可能。所需努力很小,回报却是一份随项目一起成长的可靠参考,在最初上线决策完成之后依然有用。

常见问题

example.org是一个可以访问的真实网站吗?

在本文中,example.org纯粹是用于练习阅读URL结构的假设占位符。这个练习不要求该地址作为真实页面存在。域名example.org本身被保留用于文档目的,但我们示例中的具体路径、查询和片段是为了说明而虚构的。

查询参数和片段有什么区别?

查询参数作为请求的一部分发送到服务器,可能影响服务器返回的内容。片段永远不会发送到服务器,它只告诉浏览器在已加载的页面中将读者定位到哪里。问号引导查询,井号引导片段。2

分享URL时需要包含协议方案吗?

在浏览器地址栏中,通常可以省略协议方案,因为浏览器默认使用HTTP或HTTPS。但在为项目记录地址或以书面形式分享时,包含完整的协议方案能使地址无歧义且完整。对于说明卡而言,写下包含https的完整URL是最清晰的做法。2