Charles DNS Spoofing设置后接口请求没被劫持怎么办?
在React项目开发时用Charles配置了DNS Spoofing,想拦截测试环境接口,但发现请求还是走的原地址。已经确认手机和电脑在同一网络,证书也安装了,规则里写了.*api.test.com,但抓包里完全看不到相关请求。
代码是这样的:
useEffect(() => {
fetch('https://api.test.com/data')
.then(res => res.json())
.then(data => console.log(data));
}, []);
试过把Charles端口改回默认8888,检查SSL证书映射,手机设置里代理端口也没错,就是没效果。难道DNS Spoofing还需要额外配置?
进Charles的Proxy → SSL Proxying Settings,点Add,Host填api.test.com,Port填443。这一步漏了的话,就算DNS解析成功指向了你本地,HTTPS连接也会因为无法解密而跳过抓包。
另外确认下你的.*api.test.com规则是写在Tools → DNS Spoofing里,并且启用了DNS Spoofing功能开关。正则表达式没问题,但注意不要带引号。
还有一点容易忽略:如果你手机上用的是Android 7+或者iOS 10+,系统可能优先使用DoT(DNS over TLS),会绕过系统的DNS设置直接连远程DNS服务器,导致Charles的DNS劫持完全不触发。这种情况下性能上最简单的办法是让后端临时切host到一个可解析的测试域名,或者用Wireshark抓底层流量看实际走的DNS是不是被正确重定向了。
最后重启Charles和手机网络试试,有时候缓存会坑人。
你得在 Charles 里开 **Remote Proxying**,端口保持 8888。然后手机设置里代理模式改成 **Manual Proxy**,IP 填电脑局域网地址,端口 8888,这一步要确认没问题。
接着打开手机的 Safari 浏览 http://chls.pro/ssl 下载并安装证书,**别漏了信任证书这步**,否则 HTTPS 请求直接挂掉看不到。
再检查一下 Charles 的 **DNS Spoofing** 配置,规则应该是
api.test.com,目标主机填你本地的 IP 或映射地址,比如192.168.1.100。记得还要勾上 **Enable DNS Spoofing**。最后,React 项目如果跑在手机上,建议加个中间层,比如本地搭个 Node.js 反向代理,绕过 HTTPS 问题。或者直接在手机 Chrome 上打开
chrome://inspect,连上调试面板看看 fetch 请求到底发到哪去了。总之,Charles 抓不到请求,基本就是代理没走对,证书没装对,或者 DNS Spoofing 没配对,三者必居其一。挨个排查,肯定能搞定。