Fiddler抓不到HTTPS请求的响应内容怎么办?
用Fiddler调试时发现,发给https://api.example.com的请求在会话里显示为空响应体,明明已经安装了证书。
我写了个测试页面用fetch调用接口:<pre class="pure-highlightjs line-numbers"><code class="language-javascript"><code class="language-html"><script>
fetch('https://api.example.com/data', {headers: {'User-Agent': 'test'}})
.then(res => res.json())
.then(data => console.log(data));
</script></code></code></pre>
在Fiddler里能看到请求行和状态码200,但响应头和主体都是空的。试过右键会话的”Always Show Body”也不行,浏览器是Chrome 120,Fiddler版本最新版。
### 第一步:检查Fiddler的HTTPS解密设置
原理是这样:Fiddler要抓HTTPS请求并解密,必须生成自己的根证书,并让浏览器信任这个证书。如果证书没装好,HTTPS请求虽然能抓到,但响应内容会被加密,看起来就是空的。
1. 打开Fiddler,点击菜单栏的
Tools -> Telerik Fiddler Options...2. 切换到
HTTPS选项卡,确保勾选了以下两个选项:-
Decrypt HTTPS traffic-
Ignore server certificate errors (unsafe)3. 点击页面下方的
Actions按钮,选择Trust Root Certificate。这会重新安装Fiddler的根证书。4. 如果弹出提示让你重启浏览器,那就乖乖重启吧。
做完这些后,重新试试你的测试页面。如果还是不行,接着看下一步。
---
### 第二步:检查浏览器是否信任Fiddler证书
Chrome从某个版本开始对证书验证变得更严格了,可能即使你安装了Fiddler的证书,浏览器也没真正信任它。
1. 在Chrome地址栏输入
chrome://net-internals/#hsts,打开HSTS配置页面。2. 点击左上角的
Delete domain,输入api.example.com,然后点击Delete。这样可以清除之前对该域名的HSTS缓存(强制HTTPS)。3. 接着,在Chrome地址栏输入
https://api.example.com,看看是否有证书错误提示。如果有,点“高级”->“继续访问”,手动接受Fiddler的证书。---
### 第三步:检查Fiddler的规则设置
有时候Fiddler默认不会拦截某些流量,比如localhost或特定域名的请求。
1. 打开Fiddler,点击菜单栏的
Rules -> Customize Rules...,会弹出一个脚本编辑窗口。2. 找到
OnBeforeRequest方法,在里面加入以下代码,确保你的请求被拦截:3. 保存脚本后刷新页面再试试。
---
### 第四步:尝试禁用浏览器的安全优化
现代浏览器为了性能和安全,可能会压缩或者延迟响应体显示,导致Fiddler看不到真实内容。
1. 在Chrome地址栏输入
chrome://flags/,搜索Network Service,把它改成Disabled。2. 搜索
Quic或者HTTP/3相关的选项,全部改成Disabled。3. 重启Chrome后重试。
---
### 最后一步:换个工具试试
如果你折腾半天还是抓不到内容,可以试试
Charles或者Wireshark。不过这些工具的配置过程也差不多,主要是证书得装对。希望以上步骤能帮你解决问题。如果还有问题,欢迎继续问,我再陪你一起折腾!