你在 Claude Code 里让它 fetch
http://www.weather.com.cn,结果连刷 5 次都是同一个红色报错:Unable to verify if domain www.weather.com.cn is safe to fetch. This may be due to network restrictions or enterprise security policies blocking claude.ai.看起来像是"网络/防火墙挡了 claude.ai",但真相并非如此——这个错误信息严重误导了用户和运维。

本文系统拆解 Claude Code WebFetch 报错 的真实根因,基于 Anthropic 官方 GitHub issues、Claude Code 网络配置文档、以及社区实测结果,给出 4 层递进式排查方案。文末附上国内用户通过 API易 apiyi.com 使用 Claude Code 时的最佳实践——APIYI 只负责 API 转发,WebFetch 的 preflight 问题需要代理和配置共同解决。
Claude Code WebFetch 报错的真实原因
在动手改配置前,先搞清楚错误信息到底在说什么。Claude Code WebFetch 的这个报错是一个典型的"错把感冒当癌症"的案例。
错误信息背后的真相
Claude Code 在执行任何 WebFetch 调用之前,会先做一次"域名安全验证"(preflight):向 https://claude.ai/code/ 发起 HTTP 请求,询问"这个域名能不能抓取"。问题恰好出在这一步:
| 阶段 | 实际发生的事 |
|---|---|
| ① Claude Code 内部触发 WebFetch | CLI 进程准备 fetch 目标 URL |
| ② Preflight 请求 | 向 https://claude.ai/code/ 发 HTTP 请求 |
| ③ Cloudflare Bot 防护拦截 | 返回 403 + cf-mitigated: challenge + JS Challenge |
| ④ CLI 无浏览器环境 | 无法执行 JavaScript 挑战 |
| ⑤ Preflight 失败 | 报错 "Unable to verify if domain is safe" |
| ⑥ 目标 URL 从未被访问 | 你的网络能否访问 weather.com.cn 完全无关 |
换句话说,目标站点是否可达根本没被测试过——请求在第二步就挂了。错误消息里提到的 "enterprise security policies blocking claude.ai" 这句话是真的,但"企业策略"不是你公司的 IT,而是 Anthropic 自己部署在 claude.ai 前的 Cloudflare 防护规则。
🎯 理解要点: 这是一个架构级设计问题,在 Anthropic 官方 GitHub issue #39896 中已被确认。影响所有 headless 环境——CI/CD、Docker 容器、WSL、SSH 会话、Bedrock 部署都可能中招。通过 API易 apiyi.com 转发 API 调用时也一样,因为 preflight 打的是 claude.ai 而不是 api.anthropic.com。
三种典型失败场景
根据你的网络环境,这个报错可能由不同叠加因素造成:
| 场景 | 目标网站 | 代理状态 | 根因 |
|---|---|---|---|
| A. 国内机器 + 未开代理 | 任意海外站 | 无代理 | claude.ai 直连失败 + preflight 失败 |
| B. 国内机器 + 已开代理 | 国内站(weather.com.cn) | 代理到海外 | preflight 通过代理访问 claude.ai,仍可能被 Cloudflare 挑战 |
| C. 海外机器 + 无代理 | 任意站 | 无需代理 | Cloudflare 识别 CLI 为 bot,preflight 失败 |
截图里用户 fetch www.weather.com.cn 属于场景 B——看似"国内网站应该能访问",但实际上是打到 claude.ai 的 preflight 出了问题,跟目标站点没任何关系。
Claude Code WebFetch 报错的 4 层排查路径
掌握了根因,我们按"影响面由小到大"的顺序逐层排查。

第 1 层: 代理与 NO_PROXY 环境变量
这是国内用户最常见的第一道坎。Claude Code 遵循标准代理环境变量,按以下优先级读取:
https_proxy > HTTPS_PROXY > http_proxy > HTTP_PROXY
macOS / Linux 最小配置:
# ~/.zshrc 或 ~/.bashrc
export HTTPS_PROXY=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
export NO_PROXY="localhost,127.0.0.1,::1,api.apiyi.com,vip.apiyi.com"
Windows PowerShell:
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:NO_PROXY = "localhost,127.0.0.1,api.apiyi.com,vip.apiyi.com"
也可以直接写入 ~/.claude/settings.json 的 env 块:
{
"env": {
"HTTPS_PROXY": "http://127.0.0.1:7890",
"HTTP_PROXY": "http://127.0.0.1:7890",
"NO_PROXY": "localhost,127.0.0.1,api.apiyi.com,vip.apiyi.com"
}
}
⚠️ 关键细节:
NO_PROXY必须把 API易 的中转域名(api.apiyi.com/vip.apiyi.com)加进去!否则 Claude Code 的 API 调用会经过代理绕一圈,既慢又可能被代理节点劫持。我们建议 API 走 NO_PROXY 直连 API易,WebFetch 的 preflight 走代理访问 claude.ai,两条路径分开走最稳。
基础认证代理(公司代理常见):
export HTTPS_PROXY=http://username:[email protected]:8080
注意: Claude Code 不支持 SOCKS 代理——如果你的代理只有 SOCKS 模式,用 privoxy 或 v2ray 把 SOCKS 转成 HTTP。
第 2 层: 权限预授权 WebFetch(domain:xxx)
有时候 preflight 能跑通,但 Claude Code 仍然每次询问"是否允许抓取此域名"。把常用域名加到 permissions.allow,Claude 就不会再问:
{
"permissions": {
"allow": [
"WebFetch(domain:www.weather.com.cn)",
"WebFetch(domain:github.com)",
"WebFetch(domain:developer.mozilla.org)",
"WebFetch(domain:docs.python.org)"
],
"ask": [
"WebFetch"
]
}
}
完整规则语法速查:
| 规则写法 | 匹配范围 |
|---|---|
WebFetch |
所有 WebFetch 调用 |
WebFetch(domain:example.com) |
仅 example.com |
WebFetch(domain:*.example.com) |
所有 example.com 子域名 |
WebFetch(domain:*) |
任何域名(等同放开) |
🎯 管理建议: 在企业场景下,推荐用
managed-settings.json把允许抓取的域名白名单化,放在/Library/Application Support/ClaudeCode/managed-settings.json(macOS)或/etc/claude-code/managed-settings.json(Linux),配合allowManagedPermissionRulesOnly: true强制所有开发者遵守。通过 API易 apiyi.com 调用 Claude API 的开发团队也可以用同一套规则,确保 Claude Code 和后端 API 调用的权限策略统一。
第 3 层: 企业 CA 证书与 TLS 拦截
如果你的公司用了 Zscaler / CrowdStrike / Cato Networks 等 TLS 拦截式安全产品,它们会重新签发 HTTPS 证书,导致 Claude Code 的 Node.js 运行时报 UNABLE_TO_GET_ISSUER_CERT 等 SSL 错误。
解决方式: 导出企业根 CA 证书后指向它:
export NODE_EXTRA_CA_CERTS=/path/to/company-root-ca.pem
或写入 ~/.claude/settings.json:
{
"env": {
"NODE_EXTRA_CA_CERTS": "/Users/you/certs/company-root-ca.pem",
"CLAUDE_CODE_CERT_STORE": "bundled,system"
}
}
CLAUDE_CODE_CERT_STORE 可选值:
| 值 | 含义 |
|---|---|
bundled |
仅信任 Claude Code 自带的 Mozilla CA 集合 |
system |
仅信任操作系统的证书库 |
bundled,system(默认) |
两者都信任 |
mTLS 双向认证(更严的企业环境):
export CLAUDE_CODE_CLIENT_CERT=/path/to/client-cert.pem
export CLAUDE_CODE_CLIENT_KEY=/path/to/client-key.pem
export CLAUDE_CODE_CLIENT_KEY_PASSPHRASE="your-passphrase"
第 4 层: 绕开 WebFetch,用 Bash curl 或 MCP 替代
如果上面三层都不能解决,最可靠的办法就是不用 WebFetch——让 Claude 通过 Bash 工具直接 curl,或者接入第三方 fetch MCP 服务器。
方案 A: 允许 Bash 使用 curl/wget
{
"permissions": {
"allow": [
"Bash(curl:*)",
"Bash(wget:*)"
]
}
}
然后在对话中告诉 Claude:"请用 curl 获取 www.weather.com.cn 的首页内容"——它会跳过 WebFetch 直接走 Bash。这条路径完全不触发 preflight,代理配置只要让目标站点能访问就行。
方案 B: 接入 fetch-mcp 或 Playwright MCP
# 安装第三方 fetch MCP server
claude mcp add fetch npx -- @modelcontextprotocol/server-fetch
MCP 工具的网络请求由 MCP server 进程自己发起,不经过 Claude Code 的 preflight 链路,稳定性显著提升。对于需要执行 JavaScript 的动态站点,用 Playwright MCP 更合适。

Claude Code WebFetch 的实战排查案例
理论讲完,我们看三个真实场景下的完整解决流程。
场景一: 国内 MacBook 抓取 weather.com.cn(截图场景)
现象: fetch www.weather.com.cn 连续报 Unable to verify。
排查步骤:
# Step 1 确认代理状态
echo $HTTPS_PROXY # 应该输出 http://127.0.0.1:7890 之类
# Step 2 手动验证 claude.ai 是否可达
curl -I https://claude.ai/code/ -x http://127.0.0.1:7890
# 如果返回 403 + cf-mitigated,说明 Cloudflare 拦了,去 Step 3
# 如果返回 200,说明 preflight 能过,去检查 permissions
# Step 3 在 Claude Code 里切换方案——改用 Bash + curl
# 对话中直接说:
# "别用 WebFetch,用 curl 抓 http://www.weather.com.cn 的首页"
最终配置(~/.claude/settings.json):
{
"env": {
"HTTPS_PROXY": "http://127.0.0.1:7890",
"HTTP_PROXY": "http://127.0.0.1:7890",
"NO_PROXY": "localhost,127.0.0.1,api.apiyi.com,vip.apiyi.com"
},
"permissions": {
"allow": [
"WebFetch(domain:www.weather.com.cn)",
"Bash(curl:*)",
"Bash(wget:*)"
]
}
}
🎯 国内实战提示: 国内用户最稳的组合是「API 走 API易 apiyi.com + WebFetch 走代理 + 必要时 fallback 到 curl」。API易 的 base_url 加入 NO_PROXY 后,Claude Code 的 API 请求不会被代理绕路,延迟和稳定性与海外直连一致。
场景二: 公司机器 + Zscaler TLS 拦截
现象: WebFetch 报 SELF_SIGNED_CERT_IN_CHAIN 或 UNABLE_TO_VERIFY_LEAF_SIGNATURE。
解决:
# Step 1 从 IT 获取公司根 CA 证书(通常是 .pem 或 .crt)
# Step 2 配置 Claude Code 信任这个 CA
export NODE_EXTRA_CA_CERTS=~/certs/company-zscaler-root.pem
# Step 3 同时信任系统证书库(Zscaler 通常已注入)
export CLAUDE_CODE_CERT_STORE=bundled,system
# Step 4 重启 Claude Code
场景三: Docker / CI 容器内 headless 运行
现象: 本地能跑,CI 里 WebFetch 100% 失败。
原因: 容器里既没代理也没浏览器,Cloudflare 的 bot 防护直接识别出 CLI 客户端拒绝连接。
解决: 在 CI 里禁用 WebFetch、强制走 Bash:
# .github/workflows/claude.yml 或类似
env:
CLAUDE_CODE_DISABLE_WEBFETCH: "true" # 如果此环境变量生效
或通过 --disallowedTools 启动参数:
claude --disallowedTools WebFetch --allowedTools "Bash(curl:*)"
🎯 CI 集成建议: 容器化环境里,把 API Key 指向 API易 apiyi.com 的稳定中转节点,避免因海外网络抖动导致 CI 失败。我们建议在 GitHub Actions / GitLab CI 的 secrets 里配置
ANTHROPIC_BASE_URL=https://vip.apiyi.com+ANTHROPIC_API_KEY=sk-xxx,配合 WebFetch 禁用策略,CI 的 Claude Code 任务稳定性可以做到 99% 以上。
Claude Code WebFetch 报错的工程最佳实践
跑通单次 demo 容易,要让团队里每个人都稳定使用 Claude Code,还有几个关键点。
实践一: 统一的 managed-settings.json
给团队下发统一的 managed-settings.json,避免每个人自己折腾:
{
"env": {
"HTTPS_PROXY": "http://corp-proxy:8080",
"NODE_EXTRA_CA_CERTS": "/opt/company/ca.pem",
"NO_PROXY": "*.corp.example.com,api.apiyi.com,vip.apiyi.com"
},
"permissions": {
"allow": [
"WebFetch(domain:*.corp.example.com)",
"WebFetch(domain:github.com)",
"WebFetch(domain:stackoverflow.com)",
"Bash(curl:*)"
],
"deny": [
"WebFetch(domain:*)"
]
},
"allowManagedPermissionRulesOnly": true
}
文件放置路径:
| 平台 | 路径 |
|---|---|
| macOS | /Library/Application Support/ClaudeCode/managed-settings.json |
| Linux | /etc/claude-code/managed-settings.json |
| Windows | C:\ProgramData\ClaudeCode\managed-settings.json |
实践二: 三级 fallback 策略
在 CLAUDE.md 里写清楚工具选用优先级,让 Claude 按顺序尝试:
## 网络抓取工具优先级
1. 首选 WebFetch (已预授权的域名)
2. WebFetch 失败时, fallback 到 Bash curl
3. 动态站点用 Playwright MCP
4. 永远不要用 `curl -k` 忽略证书错误
这段话进 CLAUDE.md 后,Claude 会在遇到 WebFetch 报错时自动切换 curl,用户体验明显改善。
实践三: preflight 健康检查脚本
写一个快速诊断脚本,排查时先跑一遍:
#!/bin/bash
# claude-code-doctor.sh
echo "=== 环境变量 ==="
env | grep -iE "proxy|claude_code|node_extra"
echo "=== claude.ai preflight 测试 ==="
curl -sI -o /dev/null -w "HTTP %{http_code} · %{time_total}s\n" \
https://claude.ai/code/
echo "=== api.anthropic.com 测试 ==="
curl -sI -o /dev/null -w "HTTP %{http_code} · %{time_total}s\n" \
https://api.anthropic.com/
echo "=== APIYI 中转测试 ==="
curl -sI -o /dev/null -w "HTTP %{http_code} · %{time_total}s\n" \
https://vip.apiyi.com/
echo "=== DNS 解析 ==="
nslookup claude.ai
如果 claude.ai/code/ 返回 403 且带 cf-mitigated 响应头,就是典型的 Cloudflare preflight 问题——直接上第 4 层方案。
🎯 诊断建议: 当 Claude Code 出现异常时,80% 的问题能通过这套诊断脚本定位。国内用户建议把
vip.apiyi.com作为 API 转发节点加入检查清单——如果 APIYI 可达但 Anthropic 官方站点不可达,就走 API易 apiyi.com 的中转继续工作,避免被网络问题堵死全天开发节奏。
Claude Code WebFetch 报错常见问题 FAQ
Q1: 为什么错误信息说 "enterprise security policies blocking claude.ai",但我公司没装任何安全软件?
这是 Anthropic 官方消息设计不准确。真正拦截的是 claude.ai 前的 Cloudflare bot 防护,Cloudflare 把 CLI 进程识别为 bot 返回 JS Challenge,CLI 无法完成挑战就报这个错。跟你公司的 IT 策略通常无关。
Q2: APIYI 的中转能解决 WebFetch 报错吗?
部分能。API易 apiyi.com 只负责转发 api.anthropic.com 的 API 请求,Claude Code 的模型对话、工具调用决策都能稳定工作。但 WebFetch 的 preflight 打的是 claude.ai(不是 api.anthropic.com),这条路径 APIYI 不覆盖——需要通过本地代理解决。建议组合使用:API 走 API易直连,preflight 走代理,两套路径互不干扰。
Q3: 有 skipWebFetchPreflight 这个配置项吗?
社区有讨论,但截至 2026 年 4 月官方未正式文档化。GitHub issue #39896 里提到这是一个社区期待的功能,用于跳过 preflight 校验。在正式支持前,推荐用第 4 层方案(Bash curl + 权限预授权域名)绕开这个问题,效果等同且更可控。
Q4: 我开了 Clash 全局代理,为什么 WebFetch 还是报错?
Clash 的全局代理模式不会自动设置环境变量。Claude Code 是个 Node.js CLI 进程,它只读 HTTPS_PROXY 这些环境变量,不会嗅探系统代理设置。你需要在 shell profile 里显式 export 代理变量,或者写进 ~/.claude/settings.json 的 env 块。
Q5: WebFetch 成功了但结果不完整,只有一半内容?
这是 Claude Code 的 max_content_tokens 限制。在权限规则里无法调整,但如果你通过 Claude API 直接调用 web_fetch 工具(非 Claude Code CLI),可以设置 "max_content_tokens": 100000 来加大单页抓取量。这种场景下推荐通过 API易 apiyi.com 直连 API,灵活度更高。
Q6: 报错能否通过禁用 WebFetch 彻底避免?
可以。启动时加参数:
claude --disallowedTools WebFetch
或 settings.json 里:
{
"permissions": {
"deny": ["WebFetch"]
}
}
配合允许 Bash(curl:*),Claude 会自动改用 curl,对国内用户体验反而更好。
Q7: GitHub Actions / GitLab CI 里用 Claude Code,怎么配?
CI 容器里 100% 推荐禁用 WebFetch——容器无浏览器环境,preflight 几乎必挂。同时把 API 请求指向 API易 apiyi.com 的稳定节点:
env:
ANTHROPIC_BASE_URL: https://vip.apiyi.com
ANTHROPIC_API_KEY: ${{ secrets.APIYI_KEY }}
CLAUDE_CODE_DISALLOWED_TOOLS: "WebFetch"
Claude Code WebFetch 报错总结与行动清单
回顾全文,Claude Code WebFetch 报错 的本质是 Cloudflare preflight + CLI 无浏览器的设计限制,不是你的网络或 IT 策略问题。一句话总结:
✅ 国内用户三板斧: API 走 API易 apiyi.com 直连 + 本地代理走 claude.ai preflight + Bash curl 作为 fallback,90% 的 WebFetch 报错都能绕开。
落地行动清单
按优先级执行以下 5 步:
- 配置代理: 设
HTTPS_PROXY+HTTP_PROXY,并把 API易域名加入NO_PROXY - 预授权域名: 把常抓的站点写进
permissions.allow的WebFetch(domain:...) - 处理企业 CA: 如果在 Zscaler/CrowdStrike 环境,配
NODE_EXTRA_CA_CERTS - 准备 fallback: 允许
Bash(curl:*),让 Claude 遇阻时自动切换 - 健康检查脚本: 把 claude-code-doctor.sh 加入团队工具链

🎯 最后建议: Claude Code 的网络问题是一个多层耦合的系统工程——代理、证书、权限规则、工具优先级缺一不可。我们建议先用 API易 apiyi.com 把 API 调用这条路径打通(这部分 SLA 最可控),再逐层处理 WebFetch 的 preflight 和 CA 问题。该平台支持 Claude 全系模型 + 原生工具,便于快速验证每一层配置是否生效。
作者: APIYI 技术团队 | 更多 Claude Code 实战教程,访问 help.apiyi.com