公众号旧文

一个 URL 是由哪些部分组成的?

作者:胖子阅读 —

我们每天都在浏览网页,

但却很少观察浏览器地址栏里的那一串 URL。

例如下面这个地址:

https://www.851004721.xyz:443/blog/index.html?id=1#top
│      │                  │      │            │     │
协议    域名               端口    路径         参数   锚点

这一串字符,每一部分都有自己的职责。

理解了 URL 的组成,以后分析网站、排查问题、开发程序都会容易得多。

第一部分:协议(Scheme)

https://

这部分告诉浏览器:使用什么协议去访问这个网站。

最常见的有:

  • http
  • https
  • ftp
  • ssh
  • mailto

其中 http 是普通网页协议。

而 https 是在 HTTP 的基础上增加了 TLS 加密,也就是浏览器小锁头。

现在几乎所有正规网站都已经使用了 HTTPS,协议决定了客户端如何与服务器通信,是 URL 最前面的组成部分。

第二部分:域名(Host)

www.851004721.xyz

域名就是服务器的名字。

浏览器并不能直接认识域名,它会先进行 DNS 查询,把域名解析成 IP 地址,例如:

www.851004721.xyz
↓
156.231.xxx.xxx

然后浏览器再去连接对应的服务器。

实际上,URL 中这里也可以直接写 IP,例如:

https://8.8.8.8/

不过绝大多数网站都会使用域名,因为域名更容易记忆。

第三部分:端口(Port)

:443

端口可以理解为服务器上的房间号。

同一台服务器可以同时运行很多服务,例如:

服务 默认端口
HTTP 80
HTTPS 443
SSH 22
FTP 21
MySQL 3306

例如:

https://example.com:443/

这里访问的是 HTTPS 默认端口。

由于 443 是 HTTPS 的默认端口,因此实际上下面两个地址完全等价:

https://example.com/

和

https://example.com:443/

浏览器会自动补上默认端口,所以很多网站都不会写出来。

第四部分:路径(Path)

/blog/index.html

路径表示:访问服务器上的哪个资源。

例如:

/

表示网站首页。

/news/

表示新闻栏目。

/images/logo.png

表示图片。

/blog/index.html

表示 blog 目录下的 index.html。

可能会有人以为路径一定对应服务器上的真实文件,但实际上并不是。

现在大量网站都使用动态路由,例如:

/user/1001

此时未必存在一个叫做 1001 的文件,而可能是程序根据 URL 动态生成页面。现代 Web 框架通常会把路径映射到程序中的路由,而不是文件系统。

第五部分:参数(Query)

?id=1

参数以 ? 开始。

作用是:给服务器额外提供一些信息。

例如:

?id=1

表示查看编号为 1 的文章。

多个参数之间使用 & 分隔:

?id=1&page=2&lang=zh-CN

服务器收到请求后,就可以读取这些参数:

id = 1
page = 2
lang = zh-CN

很多搜索页面就是利用参数工作的,例如:

?q=ChatGPT

表示搜索 ChatGPT。

参数会随着 HTTP 请求一起发送给服务器,因此服务器能够读取并根据参数返回不同内容。

第六部分:锚点(Fragment)

#top

实际上锚点不会发送给服务器。

浏览器请求网页时,请求的是:

https://www.851004721.xyz/blog/index.html?id=1

服务器根本不知道后面还有:

#top

网页下载完成以后,浏览器才会根据:

#top

滚动到页面中对应的位置。

例如:

#chapter3

跳到第三章。

#comments

跳到评论区。

#footer

跳到底部。

因此,锚点更多是浏览器内部定位页面内容的一种机制,而不是服务器处理请求的一部分。

把整个 URL 连起来理解

再来看一次这个地址:

https://www.851004721.xyz:443/blog/index.html?id=1#top

浏览器的工作流程如下:

  1. 使用 HTTPS 协议建立安全连接。
  2. 查询 www.851004721.xyz 的 IP 地址。
  3. 连接服务器 443 端口。
  4. 请求 /blog/index.html。
  5. 把参数 id=1 一起发送给服务器。
  6. 收到网页后,再根据 #top 自动滚动到页面顶部对应的位置。

整个过程环环相扣,最终把你想看的内容准确展示出来。