Charles精准拦截:仅限指定域名的配置指南

Charles精准拦截:仅限指定域名的配置指南

在开发调试过程中,网络请求拦截是测试接口、模拟异常场景的核心手段。但传统拦截方式(如全局拦截)容易误伤其他业务请求,导致测试环境混乱。本文将深入探讨如何通过Charles代理工具实现仅拦截指定域名的精准配置,覆盖基础规则设置、动态规则扩展及典型场景解决方案。

一、为什么需要“仅拦截指定域名”?

1.1 避免全局拦截的副作用

全局拦截模式会捕获所有经过Charles的HTTP/HTTPS请求,包括:

  • 第三方依赖库(如统计SDK、推送服务)
  • 浏览器自动发起的预检请求(OPTIONS)
  • 后台服务的心跳包

在测试支付接口时,若全局拦截api.example.com,可能意外阻断统计服务stats.example.com的请求,导致测试数据失真。

1.2 精准测试的需求场景

  • 接口联调:仅模拟核心API的异常响应
  • 性能优化:对比指定域名的加载耗时
  • 安全测试:验证特定域名的证书校验逻辑
  • 多环境隔离:同时连接测试/预发/生产环境时,避免请求交叉

二、基础配置:通过域名规则实现拦截

2.1 创建域名匹配规则

  1. 打开Charles → ProxySSL Proxying Settings
  2. Include选项卡中添加需要拦截的域名(支持通配符):
    1. *.api.example.com
    2. dev-service.*
  3. Exclude选项卡中排除无需拦截的域名(可选):
    1. *.cdn.example.com
    2. static.*

2.2 配置拦截动作

  1. 进入ToolsMap RemoteMap Local
  2. 设置条件:
    • Host:填写目标域名(如api.example.com
    • Path:可指定具体接口(如/user/info
  3. 选择动作:
    • Map Remote:重定向到测试服务器
    • Map Local:返回本地模拟文件
    • Breakpoints:手动修改请求/响应

2.3 验证规则生效

  1. 发起网络请求后,在Charles的Sequence视图中:
    • 确认目标域名请求被标记为红色(拦截状态)
    • 检查Size列是否显示本地文件大小(Map Local场景)
    • 对比Time列与正常请求的耗时差异

三、高级技巧:动态域名拦截

3.1 使用正则表达式匹配

SSL Proxying SettingsInclude字段支持正则:

  1. ^https?://(test|pre)\.api\.example\.com/.*

可同时拦截测试环境和预发环境的API请求。

3.2 结合Charles脚本实现动态拦截

  1. 创建charles.js脚本文件:
    1. function onRequest(session, request) {
    2. var host = request.getHost();
    3. if (host.match(/api\.example\.com$/)) {
    4. if (request.getPath().match(/^\/error\/500$/)) {
    5. session.setRequest(request, "HTTP/1.1 500 Internal Server Error");
    6. return true; // 拦截并修改响应
    7. }
    8. }
    9. return false; // 不拦截
    10. }
  2. 在Charles中启用脚本:ProxyScriptingNew → 选择脚本文件

3.3 多环境域名隔离方案

通过Map Remote实现:
| 原域名 | 映射目标 | 用途 |
|————|—————|———|
| api.example.com | test-api.example.com | 测试环境 |
| api.example.com | pre-api.example.com | 预发环境 |

在请求头中添加X-Env: test时自动路由到测试环境。

四、典型场景解决方案

4.1 移动端调试中的域名隔离

  1. 在iOS/Android设备中配置Charles代理
  2. 使用Focus功能(右键请求 → Focus)临时过滤非目标域名
  3. 结合Rewrite规则修改特定域名的响应:
    1. <rewrite>
    2. <match url="^https://api\.example\.com/user/info$">
    3. <response>
    4. {"code":401,"message":"模拟未授权"}
    5. </response>
    6. </match>
    7. </rewrite>

4.2 微服务架构下的接口测试

当系统由多个服务组成时:

  1. 为每个服务分配独立子域名:
    • 订单服务:order.api.example.com
    • 支付服务:pay.api.example.com
  2. 在Charles中创建对应拦截规则
  3. 通过Compose功能构造跨服务请求链

4.3 HTTPS证书固定测试

验证客户端是否严格校验证书时:

  1. 在Charles中禁用对目标域名的SSL代理
  2. 手动导入无效证书到系统信任库
  3. 观察客户端是否拒绝连接

五、最佳实践与注意事项

5.1 规则管理建议

  • 使用Save功能导出拦截规则配置
  • 为不同项目创建独立Charles配置文件
  • 定期清理未使用的映射规则

5.2 性能优化技巧

  • 对高频域名使用Throttle功能模拟弱网
  • 排除静态资源域名(如.css.js)减少规则匹配开销
  • 启用DNS Caching加速域名解析

5.3 常见问题排查

现象 可能原因 解决方案
规则不生效 域名拼写错误 检查大小写和通配符
拦截所有请求 缺少Exclude规则 SSL Proxying中排除CDN域名
HTTPS请求显示为Unknown 未安装Charles证书 在设备中安装并信任证书

六、总结与延伸

通过Charles的域名级拦截能力,开发者可以:

  1. 提升测试效率:避免手动过滤无关请求
  2. 降低环境风险:防止测试数据污染生产环境
  3. 增强调试精度:聚焦特定服务的网络行为

延伸学习方向:

  • 结合Postman的Mock服务实现全链路测试
  • 使用Wireshark进行底层网络包分析
  • 开发自定义Charles插件扩展功能

掌握精准域名拦截技术后,建议进一步探索Charles的Timeline视图分析请求时序,以及Notes功能标注关键测试点,构建系统化的网络调试工作流。