· 网络
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 是身份证号。