当你打开一个网站,浏览器地址栏里会显示一串文字,这串文字就是统一资源定位符(URL)。对于正在搭建小型项目或个人网站的读者来说,弄清这串地址每一部分的意思,有助于确认自己打开的是不是正确的页面。本文把地址拆成三个主要部分:协议、域名(即主机部分)和页面路径,并用一个假设地址 https://example.org/services/book-a-checkup 演示它们如何组合在一起,让你不必具备深入的技术知识也能核对自己的网址指向正确的位置。

读地址栏:一个假设的本地服务示例

下面用一个假设的例子把地址的各个部分说具体。一位读者准备做一个小型的本地维修服务网站,在还没注册任何东西之前,他先画了一张首页草图,并记下三个候选地址:一个只含协议与主机名的形式,比如 http 后面接主机名 fixitlocal;一个页面路径,比如 /services;还有一个更长的形式,在末尾加上查询串,比如 ?area=north。每个候选地址都只突出地址中的一个部分,好让读者看清这些部分是怎样组合起来的。

协议告诉浏览器用什么方式去取得资源,出现在主机之前。域名是其中可读的主机部分,页面路径则指向该主机上的某个具体资源。在草稿里,同一个主机配上 /services 和配上 /contact,会是同一个站点上的两个不同页面,而查询串可以携带一小段额外信息。这位读者还没有决定,服务名称应该直接放在一个已注册的域名上,还是放在像 services 这样的子域名之下,这个选择仍然留着。

这个例子只是为了讲解而虚构的,它不是真实的企业,不是测试过的地址,也不是任何人的反馈。它说明的是:读地址栏就是要把协议、主机、路径以及可能出现的查询分开,缺少某个部分或某个部分对不上,都会改变浏览器实际请求的是哪个页面。

认出协议部分

协议位于网址的最前面,它告诉浏览器必须用哪种方式去请求资源。就网站地址而言,MDN 指出协议通常是 HTTPS,或者它未加密的版本 HTTP,而访问网页需要这两者之一。协议与后面的主机部分之间,用冒号加两条斜杠这一字符组合分隔开。1

要认出它,就从地址开头读到第一个冒号为止。在前面假设的维修服务草稿里,以 http 开头、只含协议与主机名的那个形式,就把协议这一部分单独显示了出来;单看协议并不能说明请求的是哪个页面。浏览器也能处理其他协议,例如用 mailto: 打开邮件客户端,所以看到别的协议也不必意外。1

检查你记下的三个候选地址中的第一个,也就是以 http 开头、只含协议与主机名的那个形式。在注册任何东西之前,你可以先在冒号和两条斜杠处把它分成两个可见的部分。冒号之前的文字就是协议,它指明浏览器请求资源时所用的方式。在你的草稿里,http 出现在协议的位置上,分隔符之后跟着主机名 fixitlocal。你也可以再记下一个使用 https 的候选地址,把两者并排比较,因为二者都把协议放在同样的开头位置,只在冒号之前的字母上有所不同。这一比较只是作者的演示,并不是测试得出的结果。

定位域名(主机)部分

地址里协议和主机以并列形式出现之后,域名就是其中可读的主机部分。资料指出,域名是为互联网上任何一台网页服务器提供的、人一读就能认出的地址,它替代了计算机本来需要的 IPv4 或 IPv6 地址。在假设的示例中,fixitlocal 这一段就承担这个角色。2

资料把域名的结构描述为用点分隔、从右往左读的若干部分。最右边是顶级域,用来告诉使用者该域名背后服务的大致用途;像 .com、.org、.net 这类通用顶级域不要求网站符合特定标准,而某些本地顶级域可以要求服务使用某种语言,或托管在某个国家。顶级域之后是各个标签,紧挨在顶级域前面的那个标签也叫二级域。2

拿本地维修这个例子来说,你可以只盯住协议分隔符与第一个斜杠之间的字符,把主机这一部分单独圈出来。取出你记下的、以 http 开头、到 fixitlocal 为止的那个形式:双斜杠之后、任何路径或查询之前的全部内容,就是你有意注册的主机名,而 /services 和 ?area=north 都不属于它。你可以在与另外两个候选地址比对之前,先用铅笔把这一段标出来,再记下每个版本是否把同一个主机放在这个位置。如果几个版本并不一致,就想想哪一个拼写你能不打磕巴地念出来。这只是你自己的草稿取舍,并不代表已经核实的注册结果。

顺藤摸瓜找到具体页面的路径

协议在最前面,用来说明浏览器必须采用哪种方式去请求资源;对网站来说,通常是 HTTPS 或 HTTP。紧接着是授权部分,它和协议之间用“://”这组字符隔开,其中包含域名,用来说明浏览器请求的是哪一台 Web 服务器。再往后是路径,写成类似 /path/to/myfile.html 这样的一串字符,指向 Web 服务器上的某个资源。资料指出,在 Web 的早期,这样的路径代表服务器上某个实际文件的位置,但如今它多半只是 Web 服务器处理的一种抽象表示,并不对应任何实体文件。1

就你自己的草稿而言,可以把记下的完整地址抄出来,分成三段来读:先看协议,再看主机,然后从第一个斜杠开始,把它后面的一切都当作页面路径。如果你的草图里主机后面跟着 /services,那么结尾的这一段就是你要指名的页面,而不是域名本身。

你还可以把主机单独写在一行,再拿它和完整地址作对比。只看到 http 和主机、没有 /services,会更容易看清哪些字符是你要注册的,哪些字符只是指向一个你日后才会搭建的页面。

关于网址各部分的常见误解

一种常见的错误是把域名当成搜索词,而不是主机。在那份虚构的笔记里,有人可能一开始只在搜索框里输入 fixitlocal 这几个字,没找到有用的结果,就断定这个名字不可用。不妨换一种做法:把主机看作协议分隔符与第一个斜杠之间的那一段,再问这个确切拼写能否作为你选定的主机。哪个候选保留、哪个放弃,可以由你自己决定。

还有一种误解,以为页面路径是注册名称的一部分。在带有 /services 的草稿地址里,这个路径指向某个具体页面,但它并不是你在选择主机时要注册或比较的东西。你可以把主机写在一行、把路径写在下一行,比如单独写 fixitlocal,下面再写 /services。这一处小小的改动能让两个部分各自回答不同问题这件事更清楚。

第三种混淆是以为像 ?area=north 这样的查询串会改变网站的身份。在这个例子里,它只是缩小页面显示哪部分内容,并不属于主机。在自己的草稿上,你可以标出主机到哪里结束、路径从哪里开始,然后决定哪个候选留作首页,哪个作为页面层面的细节另放一边。

核对网站地址的实用做法

拿一个候选地址出来,把它改写成几行带标签的短句:协议、主机、路径。按假设的维修服务例子,就是在第一行写“http”,在第二行写“fixitlocal”,在第三行写“/services”。你可以在纸上手写,也可以放进一个纯文本文件;不妨把原来那整行留在标签上方,方便对照。这样分行标注会促使你判断每一部分到哪里结束,而这正是这项练习的意义。

接着,把主机那一行读出声来,把它当作一个名字来听,而不是当作搜索词。如果听起来像三个词挤在一起,你可以在笔记里加一个连字符,看看结果是否仍然清楚;若变得别扭,这也是有用的信息,能帮你判断该偏向哪个候选。还可以把路径单独写成一句话,例如“服务页面位于路径 /services”。把这句话和你那几行标签对照,就能看出自己是否误把路径当成了要注册的名字的一部分。

最后,选一个候选,并在旁边注一句简短理由。你可以写:“我倾向于用 /services 这个路径,因为它点明了我打算先做的网站板块。”这样你就留下了一条可以回头查看的取舍记录;万一改了主意,先前的标注也能让变化有迹可循,而不是悄无声息。

以上都只是作者的建议,并不是谁替你测试过的步骤。它的价值在于,让你在定下名字之前,更容易检查并修改自己草拟的地址。

常见问题

我正打算做一个小型本地服务,什么都还没注册,应该先记下哪些候选地址?

可以先用一个假设的例子把地址各部分具体化。假设一位读者准备做一个小型本地维修服务,在注册任何东西之前先画了首页草稿,并记下三种候选写法:只含协议和主机、以 http 开头后接主机名 fixitlocal 的形式;带页面路径的形式,例如 /services;以及再加一段查询字符串的更长形式,例如 ?area=north。每种写法只突出一部分,方便你看清这些部分是如何拼合起来的。

在还没注册任何东西之前,我怎么把只含协议和主机的候选地址拆成两段看得见的部分?

就拿你记下的三种候选地址中的第一种——以 http 开头、只含协议和主机的那种来看。在注册任何东西之前,你可以在冒号和双斜杠处把它分成两段看得见的部分:冒号前是协议,它说明浏览器请求资源时使用什么协议;分隔符后面跟着的是主机名 fixitlocal。你也可以再写一个用 https 的候选地址并排比较,两者都把协议放在最前面,区别只在冒号前的字母。

我怎么把自己的某个候选地址改写成几行带标签的短句?

拿出一条候选地址,把它改写成几行带标签的短句,分别是协议、主机和路径。以那个假想的维修服务为例,就是第一行写“http”,第二行写“fixitlocal”,第三行写“/services”。你可以手写在纸上,也可以写进纯文本文件,并保留原来的一整行放在标签上方,方便对照。这样标注会迫使你判断每一部分在哪里结束。