这时候你可以临时关掉系统代理试试:终端执行 sudo networksetup -setwebproxy "Wi-Fi" 127.0.0.1 8888(Charles 默认端口 8888),或者更简单——直接在 Charles 菜单里点 Help → Install Charles Root Certificate to System Keychain,有时候证书没装好也会导致本地请求被系统拦截。
另外确认下 Charles 的代理开关开了没:Proxy → Proxy Settings → 确保 HTTP、HTTPS、SOCKS 都勾了,端口是 8888(默认),然后顶部菜单 Proxy → Record Session 是亮的(没灰色)。
最后再给你个快速诊断小技巧:在终端执行 curl -v http://127.0.0.1:3000/api/test -x http://127.0.0.1:8888,加 -x 参数强制走 Charles 代理。如果这个请求能在 Charles 里看到,说明就是 localhost 绕过代理的问题,不是 Charles 本身的问题。
总之记住一句话:本地开发别用 localhost 直连,要么改用 127.0.0.1,要么在 Charles 里配置 Local Proxy。我平时都是直接配 Local Proxy,一劳永逸,不用改代码。你试试看,有问题再问。
别急,解决方法其实有好几种,我按常用程度给你列几个靠谱方案,你挑一个就行:
方案一:用 127.0.0.1 代替 localhost(最简单,90% 的情况够用)
你开发服务器跑在 localhost:3000,但 Charles 代理默认只拦截非本地回环地址的流量。那你就别用 localhost,改成 http://127.0.0.1:3000/api/test 访问试试。这个 IP 虽然和 localhost 等价,但系统不会把它当成“本地特殊地址”来绕过代理。
不过你可能要改前端代码里写死的 localhost 地址,或者用环境变量控制,这个看你怎么方便。
方案二:改 Charles 的本地代理设置(推荐,一劳永逸)
Charles 本身支持一个叫 “Local Proxy” 的功能,专门用来抓 localhost 请求。步骤是这样的:
1. 打开 Charles,点顶部菜单栏的 Proxy → Local Proxy
2. 点加号(+)添加一个本地监听项
3. Host 填 127.0.0.1(或者 localhost,但推荐 IP)
4. Port 填你本地服务的端口,比如 3000
5. 确认保存
然后你访问 http://127.0.0.1:3000/api/test 就能被抓到了。注意这里还是用 127.0.0.1,别用 localhost,虽然 Charles 后面也能处理 localhost,但实测 127.0.0.1 更稳定。
如果想更彻底支持 localhost,可以在 Local Proxy 里再加一条 Host 填 localhost,Port 还是 3000,这样 http://localhost:3000 的请求也能抓。
方案三:用 docker 或其他容器跑服务时的特殊情况(补充)
如果你本地开发是用 docker 跑的,比如 nginx 或 node 服务在容器里,那问题可能更复杂。因为容器网络是隔离的,localhost 在宿主机和容器里指向不同东西。这时候建议你:
- 把服务的端口映射到宿主机,比如 docker run -p 3000:3000
- 然后用宿主机的 IP(比如 127.0.0.1 或局域网 IP)访问,而不是容器里的 localhost
- 或者在容器里跑 Charles 客户端(不推荐,麻烦)
方案四:macOS 12+ 系统的隐藏坑(特别提醒)
你用的是 macOS 吗?如果是 Monterey(12)或更新版本,系统默认会启用 “Private Relay” 或者更严格的本地流量策略,可能连 127.0.0.1 都会绕过代理。
这时候你可以临时关掉系统代理试试:终端执行
sudo networksetup -setwebproxy "Wi-Fi" 127.0.0.1 8888(Charles 默认端口 8888),或者更简单——直接在 Charles 菜单里点 Help → Install Charles Root Certificate to System Keychain,有时候证书没装好也会导致本地请求被系统拦截。另外确认下 Charles 的代理开关开了没:Proxy → Proxy Settings → 确保 HTTP、HTTPS、SOCKS 都勾了,端口是 8888(默认),然后顶部菜单 Proxy → Record Session 是亮的(没灰色)。
最后再给你个快速诊断小技巧:在终端执行
curl -v http://127.0.0.1:3000/api/test -x http://127.0.0.1:8888,加 -x 参数强制走 Charles 代理。如果这个请求能在 Charles 里看到,说明就是 localhost 绕过代理的问题,不是 Charles 本身的问题。总之记住一句话:本地开发别用 localhost 直连,要么改用 127.0.0.1,要么在 Charles 里配置 Local Proxy。我平时都是直接配 Local Proxy,一劳永逸,不用改代码。你试试看,有问题再问。