dob
← 全部笔记

· 网络

URL 和 URI:一个是住址,一个是身份证

URI 是大类,URL 能定位,URN 只命名。数据库连接串为什么也是 URL。

三个词

URI(Uniform Resource Identifier)是大类:统一标识一个资源。

URL(Uniform Resource Locator)是能定位的 URI:既说「是谁」,也说「去哪找」。日常开发里 99% 见到的是它。

URN(Uniform Resource Name)只标识、不定位。例如 urn:isbn:0-486-27557-4。

URI(统称)
├── URL(告诉你在哪)— 最常见
└── URN(只告诉你它叫什么)— 少见

每个 URL 都是 URI,反过来不成立。

URL 拆开看

https://user:secret@example.com:8080/path/to/x?q=1#sec
 \___/   \________/ \_________/ \__/ \_______/ \_/ \_/
 scheme   userinfo     host     port   path   query fragment
  • scheme:协议,http / https / mysql / redis / ftp
  • userinfo:用户名密码。能不写在 URL 里就别写
  • host / port:主机和端口。不写端口就用协议默认值,http=80,https=443,mysql=3306
  • path / query:资源路径和查询串
  • fragment:# 后面那截,浏览器自己用,不会发给服务器

scheme + host + port 是定位信息。拿掉它们,剩下的 path + query + fragment 才是「这个资源叫什么」。

数据库连接串也是 URL

mysql://root:secret@localhost:3306/mydb
postgres://user:secret@db.example.com:5432/testdb
redis://default:secret@127.0.0.1:6379/0

驱动按标准 URL 解析。你以为是「连接字符串」,规范里它就是 URL。

前后端为什么经常混着说

// 前端:完整 URL
fetch('https://api.example.com/v1/users/123')

// 后端:只关心 URI 的 path
@GetMapping("/v1/users/{id}")

前后端分离时,URI 多半指路径,URL 指带域名的完整地址。规范分得清,口头混用也没人管。自己心里有这张图就行。

心智模型:URI 是大类。URL 是家庭住址,URN 是身份证号。