你是否遇到过这些场景:线上接口返回异常但 DevTools 看不到?想把线上请求映射到本地调试?手机 App 的网络请求怎么抓?
如果你和我一样,对"代理"、"抓包"、"SSL 证书"这些概念一知半解,这篇文章帮你彻底搞懂。
一句话:Charles 是一个 HTTP/HTTPS 代理服务器,能拦截并展示你电脑/手机上所有的网络请求和响应。
你可以把它理解成"网络请求的监控摄像头" — 所有进出你设备的流量都经过它,它全部记录下来给你看,还能让你中途修改。
HTTP 是明文传输的,Charles 作为中间人,直接就能看到所有内容:
浏览器 ── 请求 ──▶ Charles(看到并记录)── 请求 ──▶ 服务器
浏览器 ◀── 响应 ── Charles(看到并记录)◀── 响应 ── 服务器
不需要任何额外配置,打开 Charles 就能看到所有 HTTP 请求的完整信息。
HTTPS = HTTP + TLS 加密。浏览器和服务器之间建立了加密隧道,Charles 虽然转发了数据,但只能看到"谁连了谁",看不到具体内容。
这就是你在 Charles 里看到某些请求只显示 CONNECT 和一个 🔒 锁图标的原因 — Charles 知道你访问了 https://example.com,但不知道你请求了什么、服务器返回了什么。
为了看到 HTTPS 的内容,Charles 需要开启 SSL Proxying,这时它会变成双面间谍:
┌─────────────────────────┐
浏览器 ──TLS加密──▶ │ Charles(持有假证书) │ ──TLS加密──▶ 真实服务器
│ ① 用假证书冒充服务器 │
│ ② 解密浏览器发来的请求 │
│ ③ 用真证书访问真实服务器 │
│ ④ 解密服务器返回的响应 │
│ ⑤ 再用假证书加密返回浏览器 │
└─────────────────────────┘
整个过程:
https://api.example.com
api.example.com 的证书返回给浏览器api.example.com 建立连接,把请求转发过去浏览器全程被蒙在鼓里。
浏览器不是傻子。正常情况下,收到一张"假证书"会立刻报错:NET::ERR_CERT_AUTHORITY_INVALID。
安装 Charles 根证书的意思是:告诉系统"我信任 Charles 签发的所有证书"。这样浏览器收到 Charles 伪造的证书时就不会报警了。
*:443 通配符为什么会搞坏某些网站?在 SSL Proxying Settings 里配了 *:443 后,Charles 会对所有 HTTPS 流量执行中间人解密。大部分情况下没问题,但有几种例外:
| 情况 | 原因 |
|---|---|
| 证书钉扎(Certificate Pinning) | 某些 App/网站会硬编码真实证书的指纹,发现不是原证书就拒绝连接 |
| HSTS Preload | 浏览器内置了某些域名的证书规则,不接受非官方 CA 签发的证书 |
| 双向认证(mTLS) | 服务器要求客户端也出示证书,Charles 无法提供 |
| 系统级请求 | macOS 推送通知、iCloud 同步等系统服务被代理后可能异常 |
Include: my-api.com:443
问题:其他所有 HTTPS 请求都只能看到 CONNECT 隧道,看不到内容。抓包功能大打折扣。
*:443 通配符 + 不管 ExcludeInclude: *:443
Exclude: (空)
问题:所有 HTTPS 流量都被解密,可能导致某些网站/App 访问异常。
*:443 通配符 + Exclude 排除问题域名Include: *:443
Exclude: problematic-site.com:443
some-pinned-app.com:443
默认能看到所有 HTTPS 内容,遇到哪个网站因 Charles 挂掉了,就加到 Exclude 里。这是最省心的方案。
最基础的功能。打开 Charles → 访问页面 → 左侧 Structure 列表找到目标域名 → 点击具体请求。
实际场景:后端说"接口没问题",你觉得前端也没问题。Charles 一抓包,发现请求参数少传了一个字段 — 破案。
把线上/测试环境的请求映射到本地开发服务器,这是前端最高频使用的功能。
线上请求:https://cdn.example.com/app/index.js
映射到: http://127.0.0.1:3000/index.js

配置方式:Tools → Map Remote → Add
| 字段 | From(线上) | To(本地) |
|---|---|---|
| Protocol | https | http |
| Host | cdn.example.com | 127.0.0.1 |
| Port | 443 | 3000 |
| Path | /app/* | /* |
使用场景:
⚠️ 如果 From 是 HTTPS,必须在 SSL Proxying 的 Include 中添加该域名!否则 Map Remote 不生效。
用本地文件替换接口返回,非常适合 Mock 数据。
请求 https://api.example.com/user/info
→ 返回本地文件 ~/mock/user-info.json
配置方式:Tools → Map Local → Add

使用场景:
修改请求或响应的 Header、Body、URL 等。
配置方式:Tools → Rewrite → Add
| 场景 | 做法 |
|---|---|
| 解决跨域 | 修改 Response Header,添加 Access-Control-Allow-Origin: *
|
| 修改 Cookie | 修改 Request Header 的 Cookie 字段 |
| 模拟接口超时 | 修改 Response Status 为 504
|
| 注入调试参数 | 修改 Request URL 的 Query 参数 |
拦截请求或响应,手动编辑后再放行。类似 Debugger,但是针对网络请求。
使用方式:右键请求 → Breakpoints → 再次发送该请求时会被拦截
使用场景:
模拟弱网环境,测试页面在慢网下的表现。
配置方式:Proxy → Throttle Settings → 勾选 Enable Throttling → 选择预设或自定义
| 预设 | 下载速度 | 延迟 |
|---|---|---|
| 3G | 780 Kbps | 200ms |
| 4G | 6 Mbps | 50ms |
| WiFi | 30 Mbps | 2ms |
前往 Charles 官网 下载安装。
*,Port 填 443
8888
chls.pro/ssl 下载并安装描述文件基本步骤与 iOS 相同,但 Android 7.0+ 默认不信任用户安装的 CA 证书。解决方案:
AndroidManifest.xml 中配置 networkSecurityConfig 信任用户证书这些是 HTTPS 请求,且该域名未被 SSL Proxying 解密。确认 SSL Proxying 的 Include 列表中包含该域名(或通配符 *:443)。
该网站的证书被 Charles 代理后出了问题。两种解决方式:
排查清单:
Charles 修改了系统代理设置但没正常还原。手动关闭:
三种方式:
| 操作 | macOS | Windows |
|---|---|---|
| 开始/停止录制 | ⌘ R |
Ctrl + R |
| 清空会话 | ⌘ K |
Ctrl + K |
| 重放选中请求 | ⌘ R |
Ctrl + R |
| 搜索请求 | ⌘ F |
Ctrl + F |
| 概念 | 一句话理解 |
|---|---|
| Charles | 网络请求的监控摄像头 + 编辑器 |
| 代理 | 浏览器把请求托管给 Charles,Charles 帮忙转发 |
| SSL Proxying | Charles 伪造证书做中间人,解密 HTTPS 流量 |
| 根证书 | 让系统信任 Charles 的"假证书",否则浏览器会报错 |
| Map Remote | 把线上请求指向本地服务器 |
| Map Local | 用本地文件替换接口返回 |
| Rewrite | 修改请求/响应的 Header、Body |
| Breakpoints | 拦截请求/响应,手动编辑后放行 |
SSL Proxying 推荐配置:Include 保留 *:443,遇到问题域名加到 Exclude。
掌握以上内容,日常前端开发中 90% 的抓包和代理调试需求都能搞定 🎉
如果这篇文章对你有帮助,欢迎点赞收藏 ❤️