URL
- [URL 的通用结构](#URL 的通用结构)
- [数据库连接中的 URL](#数据库连接中的 URL)
- 搜索引擎的复杂查询
- [URL 编码](#URL 编码)
- [URL 解析过程](#URL 解析过程)
URL 的通用结构
URL 是协议驱动的资源定位符。URL 的标准格式如下:
text
<协议>://<主机>:<端口>/<路径>?<查询字符串>
示例
解析
作用
特性
格式
URL 通用结构
协议
Scheme
主机
域名/IP
端口
Port
路径
Path
查询字符串
Query String
https / jdbc:mysql / ftp
通过 DNS 与 IP 互相转换
区分同一主机上的不同程序
带有层次结构,精准定位资源
键值对格式:key1=val1&key2=val2
数据库连接中的 URL
很多后端开发者第一次意识到 URL 的普适性,是通过 JDBC 的连接字符串:
text
jdbc:mysql://127.0.0.1:3306/javacode?characterEncoding=utf8&useSSL=false
这个字符串完美契合了 URL 的通用结构:
| 组成部分 | 解析值 | 技术含义 |
|---|---|---|
| 协议 | jdbc:mysql |
告诉程序使用 JDBC 桥接驱动,并指明子协议是 MySQL |
| 主机 | 127.0.0.1 |
数据库所在服务器地址(本机回环地址) |
| 端口 | 3306 |
MySQL 服务的默认监听端口 |
| 路径 | /javacode |
定位到名为 javacode 的数据库实例 |
| 查询字符串 | characterEncoding=utf8&useSSL=false |
附带连接参数:强制 UTF-8 编码,并禁用 SSL 连接 |
搜索引擎的复杂查询
以在 Google 搜索 java 时生成的 URL 为例:
text
https://www.google.com/search?q=java&sca_esv=31f75f21cab977db&hl=zh_CN&sxsrf=...&source=hp&ei=...
| 组成部分 | 解析值 | 技术含义 |
|---|---|---|
| 协议 | https |
采用 SSL/TLS 加密的 HTTP 协议,保证数据传输安全 |
| 主机 | www.google.com |
Google 搜索服务的域名,通过 DNS 解析为真实 IP 地址 |
| 端口 | 未显式显示(默认 443) |
HTTPS 的标准端口,浏览器会自动补全并连接该端口 |
| 路径 | /search |
指向 Google 服务器上处理搜索请求的入口点(类似 Servlet/Controller 的映射路径) |
| 查询字符串 | q=java&sca_esv=...&hl=zh_CN&... |
键值对集合,包含用户搜索词(q=java)、界面语言(hl=zh_CN)、会话追踪 ID 等十余个参数,各参数之间用 & 分隔 |
补充说明 :
hl=zh_CN这个参数告诉 Google 服务器,用户偏好中文(中国大陆)界面的搜索结果,这是通过查询字符串灵活控制资源表现的典型例子。
URL 编码
为什么需要编码?
URL 中允许使用的字符是有限的(如字母、数字、-_.~ 等)。如果参数值里包含了保留字符(如 : / ? & = 等)或非 ASCII 字符(如中文),就必须进行转换,否则会破坏 URL 的结构。这就产生了 URL 编码,也叫百分号编码。规则是:
- 对于非 ASCII 字符(如汉字),先用 UTF-8 编码得到字节序列,再把每个字节转为
%加上两位十六进制数。 - 对于 ASCII 中的保留字符,同样用
%加十六进制替代。
服务器对 URL 的处理全流程:
服务端处理
是
否
用户在浏览器输入
或用程序构建URL
包含特殊字符
或非ASCII字符?
进行URL编码
采用UTF-8字符集为主
直接发送请求
服务器接收请求
按 & 分割查询字符串
对 key=value 部分
进行 URL 解码
得到原始参数
传递到业务逻辑
整个流转过程,编码与解码必须匹配。常见的问题是双端编解码不一致(如客户端用 GBK 对中文编码,服务器用 UTF-8 解码),导致中文乱码。
编码规则对照表
| 字符 | 用途 | URL 中直接出现? | 编码结果 |
|---|---|---|---|
q |
普通字母 | ✅ 可以 | q |
& |
分隔多个参数 | ❌ 会被误解析 | %26 |
= |
分隔键和值 | ❌ 会被误解析 | %3D |
| 空格 | 空格 | ❌ 可能中断链接 | %20 或 + |
中 |
中文 | ❌ 非 ASCII | %E4%B8%AD |
/ |
路径分隔符 | ❌ 在查询值中需转义 | %2F |
查询字符串关键参数
| 参数 | 值 | 含义 |
|---|---|---|
q |
java |
核心查询词 。所有复杂参数中,只有 q 是你的搜索意图。 |
hl |
zh_CN |
界面语言偏好,这里是简体中文。 |
source |
hp |
流量来源标识,hp 代表首页。Google 用它统计用户行为。 |
oq |
java |
在搜索框中输入的原始关键词。 |
sclient |
gws-wiz |
内部客户端类型标识。 |
其余参数(sca_esv, ei, ved 等)主要用于安全校验、会话跟踪、广告归因等技术目的,普通用户无需关注。
URL 解析过程
一次完整的 URL 解析,其实就是:
- 确认使用什么协议找到资源的传送方式。
- 通过 DNS 将域名解析成 IP,找到网络中唯一的主机。
- 通过端口号,在这台主机上锁定具体服务程序。
- 通过路径,让服务程序知道你要访问哪类资源。
- 通过查询字符串,告诉服务程序关于这个资源的具体要求。
- 在这个过程中,整个 URL 只能使用 ASCII 和安全字符,其余字符必须通过百分号编码"伪装"成符合规范的形式。