Полная диагностика ошибок Claude Code WebFetch: 4 шага для решения проблемы Unable to verify if domain

Когда вы просите Claude Code выполнить fetch для http://www.weather.com.cn, и пять раз подряд получаете одну и ту же красную ошибку: 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-unable-to-verify-domain-fix-ru 图示

В этой статье мы разберем реальную причину ошибки Claude Code WebFetch, опираясь на официальные GitHub issues Anthropic, документацию по настройке сети Claude Code и результаты тестов сообщества. Мы предложим пошаговый план устранения неполадок. В конце статьи — лучшие практики для пользователей, работающих с Claude Code через APIYI (apiyi.com): APIYI отвечает только за пересылку API, а проблему с preflight-запросами WebFetch нужно решать через настройку прокси.

Реальная причина ошибки Claude Code WebFetch

Прежде чем менять конфиги, давайте разберемся, что на самом деле означает это сообщение. Ошибка Claude Code WebFetch — это классический случай, когда «лечат простуду, а думают, что это рак».

Истина за сообщением об ошибке

Перед выполнением любого вызова WebFetch Claude Code сначала проводит «проверку безопасности домена» (preflight): отправляет HTTP-запрос на https://claude.ai/code/ с вопросом: «Можно ли парсить этот домен?». Проблема кроется именно здесь:

Этап Что происходит на самом деле
① Claude Code запускает WebFetch Процесс CLI готовится к fetch целевого URL
Preflight-запрос Отправляется HTTP-запрос на https://claude.ai/code/
Блокировка 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-отдела, а правила защиты Cloudflare, развернутые самой Anthropic перед claude.ai.

🎯 Главное: Это архитектурная проблема, подтвержденная в официальном GitHub issue #39896. Она затрагивает все headless-среды: CI/CD, Docker-контейнеры, WSL, SSH-сессии, развертывания через Bedrock. При использовании API-прокси, такого как APIYI (apiyi.com), ситуация аналогичная, так как preflight-запрос идет на claude.ai, а не на api.anthropic.com.

Три типичных сценария сбоя

В зависимости от вашей сетевой среды, эта ошибка может быть вызвана разными факторами:

Сценарий Целевой сайт Статус прокси Причина
A. Локальная машина + без прокси Любой зарубежный сайт Нет прокси Прямое подключение к claude.ai падает + сбой preflight
B. Локальная машина + с прокси Локальный сайт (weather.com.cn) Прокси на зарубеж Preflight идет через прокси к claude.ai, но все равно ловит челлендж Cloudflare
C. Зарубежный сервер + без прокси Любой сайт Не нужен Cloudflare распознает CLI как бота, сбой preflight

Случай пользователя на скриншоте с www.weather.com.cn относится к сценарию B — кажется, что «локальный сайт должен открываться», но на самом деле проблема в preflight-запросе к claude.ai, который не имеет никакого отношения к целевому сайту.

4 уровня диагностики ошибок Claude Code WebFetch

Разобравшись с первопричинами, давайте пройдемся по уровням диагностики, двигаясь от частного к общему.

claude-code-webfetch-unable-to-verify-domain-fix-ru 图示

Уровень 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"

Также можно прописать это напрямую в блок env файла ~/.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"
  }
}

⚠️ Важный нюанс: В NO_PROXY обязательно нужно добавить домены сервиса-прокси APIYI (api.apiyi.com / vip.apiyi.com)! Иначе вызов модели Claude Code пойдет через прокси, что не только замедлит работу, но и может привести к перехвату трафика прокси-узлом. Мы рекомендуем пускать API напрямую через NO_PROXY к APIYI, а preflight для WebFetch — через прокси к 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 Claude через APIYI (apiyi.com), могут применять те же правила, чтобы обеспечить единообразие политик доступа для Claude Code и бэкенд-вызовов модели.

Уровень 3: Корпоративные CA-сертификаты и TLS-инспекция

Если в вашей компании используются продукты для TLS-инспекции, такие как Zscaler / CrowdStrike / Cato Networks, они перевыпускают HTTPS-сертификаты. Это приводит к тому, что среда выполнения Node.js в Claude Code выдает SSL-ошибки типа UNABLE_TO_GET_ISSUER_CERT.

Решение: Экспортируйте корневой 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 Доверять только набору Mozilla CA, встроенному в Claude Code
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 или подключите сторонний MCP-сервер для fetch.

Вариант А: Разрешить Bash использовать curl/wget

{
  "permissions": {
    "allow": [
      "Bash(curl:*)",
      "Bash(wget:*)"
    ]
  }
}

Затем в чате попросите Claude: "Пожалуйста, получи содержимое главной страницы www.weather.com.cn с помощью curl". Он пропустит WebFetch и выполнит запрос через Bash. Этот путь вообще не вызывает preflight, главное — чтобы целевой сайт был доступен через ваш прокси.

Вариант Б: Подключение fetch-mcp или Playwright MCP

# Установка стороннего fetch MCP-сервера
claude mcp add fetch npx -- @modelcontextprotocol/server-fetch

Сетевые запросы через MCP-инструменты инициируются самим процессом MCP-сервера и не проходят через цепочку preflight в Claude Code, что значительно повышает стабильность. Для динамических сайтов, требующих выполнения JavaScript, лучше подойдет Playwright MCP.

claude-code-webfetch-unable-to-verify-domain-fix-ru 图示

Практические кейсы по устранению неполадок с Claude Code WebFetch

Теорию разобрали, теперь давайте посмотрим на полный процесс решения проблем в трех реальных сценариях.

Сценарий 1: Парсинг weather.com.cn на MacBook в Китае (сценарий со скриншотами)

Симптом: при попытке fetch сайта www.weather.com.cn постоянно вылетает ошибка Unable to verify.

Шаги по диагностике:

# Шаг 1: Проверяем статус прокси
echo $HTTPS_PROXY  # Должен вывести что-то вроде http://127.0.0.1:7890

# Шаг 2: Вручную проверяем доступность claude.ai
curl -I https://claude.ai/code/ -x http://127.0.0.1:7890
# Если вернулся 403 + cf-mitigated, значит Cloudflare блокирует запрос, переходим к Шагу 3
# Если вернулся 200, значит preflight проходит, проверяем permissions

# Шаг 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 через сервис-прокси APIYI (apiyi.com) + WebFetch через прокси + fallback на curl при необходимости». Добавление base_url от APIYI в NO_PROXY гарантирует, что API-запросы Claude Code не будут идти в обход через прокси, что обеспечивает такую же задержку и стабильность, как при прямом подключении из-за рубежа.

Сценарий 2: Корпоративная сеть + TLS-инспекция Zscaler

Симптом: WebFetch выдает SELF_SIGNED_CERT_IN_CHAIN или UNABLE_TO_VERIFY_LEAF_SIGNATURE.

Решение:

# Шаг 1: Получите у IT-отдела корневой CA-сертификат компании (обычно .pem или .crt)
# Шаг 2: Настройте Claude Code на доверие этому CA
export NODE_EXTRA_CA_CERTS=~/certs/company-zscaler-root.pem

# Шаг 3: Дополнительно доверяем системному хранилищу сертификатов (Zscaler обычно уже внедрен туда)
export CLAUDE_CODE_CERT_STORE=bundled,system

# Шаг 4: Перезапустите Claude Code

Сценарий 3: Запуск в headless-режиме внутри Docker / CI

Симптом: локально все работает, в CI WebFetch падает в 100% случаев.

Причина: в контейнере нет ни прокси, ни браузера, и защита Cloudflare от ботов распознает CLI-клиент и блокирует соединение.

Решение: в CI отключите WebFetch и принудительно используйте Bash:

# .github/workflows/claude.yml или аналогичный файл
env:
  CLAUDE_CODE_DISABLE_WEBFETCH: "true"  # если эта переменная окружения поддерживается

Или через аргументы запуска --disallowedTools:

claude --disallowedTools WebFetch --allowedTools "Bash(curl:*)"

🎯 Совет по CI-интеграции: В контейнеризированной среде направляйте API-ключ на стабильные узлы-посредники APIYI (apiyi.com), чтобы избежать сбоев CI из-за сетевых колебаний при обращении к зарубежным серверам. Мы рекомендуем прописать в secrets GitHub Actions / GitLab CI параметры ANTHROPIC_BASE_URL=https://vip.apiyi.com и ANTHROPIC_API_KEY=sk-xxx. В сочетании с политикой отключения WebFetch это позволит добиться стабильности задач Claude Code в CI выше 99%.

Инженерные практики при ошибках WebFetch в Claude Code

Запустить демо легко, но чтобы вся команда стабильно использовала Claude Code, есть несколько важных нюансов.

Практика 1: Единый 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

Практика 2: Стратегия трехуровневого fallback

Четко пропишите приоритеты выбора инструментов в CLAUDE.md, чтобы Claude пробовал их по порядку:


## Приоритеты инструментов веб-скрейпинга

1. Приоритет отдается WebFetch (для предварительно авторизованных доменов).
2. Если WebFetch не срабатывает, происходит откат (fallback) к Bash curl.
3. Для динамических сайтов используйте Playwright MCP.
4. Никогда не используйте `curl -k` для игнорирования ошибок сертификатов.

```markdown
Эта настройка добавляется в CLAUDE.md, чтобы Claude при возникновении ошибки WebFetch **автоматически переключался на curl**, что значительно улучшает пользовательский опыт.

Практика 3: Скрипт проверки работоспособности (preflight)

Напишите быстрый диагностический скрипт, чтобы запускать его перед началом работы:

#!/bin/bash
# claude-code-doctor.sh

echo "=== Переменные окружения ==="
env | grep -iE "proxy|claude_code|node_extra"

echo "=== Тест preflight claude.ai ==="
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 в список проверок — если APIYI доступен, а официальный сайт Anthropic нет, используйте сервис-прокси APIYI (apiyi.com), чтобы не останавливать рабочий процесс из-за сетевых ограничений.

FAQ по ошибкам Claude Code WebFetch

Q1: Почему сообщение об ошибке гласит "enterprise security policies blocking claude.ai", хотя у меня в компании нет никакого защитного ПО?

Это неточное сообщение от Anthropic. На самом деле блокировка происходит из-за защиты Cloudflare bot перед claude.ai. Cloudflare распознает процесс CLI как бота и возвращает JS Challenge, который CLI не может пройти, из-за чего и возникает эта ошибка. С политиками безопасности вашей компании это обычно не связано.

Q2: Может ли сервис-прокси APIYI решить проблему с ошибкой WebFetch?

Частично. APIYI (apiyi.com) отвечает только за пересылку API-запросов к api.anthropic.com, поэтому диалоги с моделью и вызовы инструментов в Claude Code будут работать стабильно. Однако preflight для WebFetch направлен на claude.ai (а не на api.anthropic.com), этот путь APIYI не покрывает — проблему нужно решать через локальный прокси. Рекомендуется комбинированный подход: API идет через прямое соединение с APIYI, а preflight — через прокси.

Q3: Есть ли параметр конфигурации skipWebFetchPreflight?

В сообществе это обсуждается, но по состоянию на апрель 2026 года официальной документации нет. В GitHub issue #39896 упоминается, что это ожидаемая функция для пропуска проверки preflight. До официальной поддержки рекомендуется использовать решение 4-го уровня (Bash curl + авторизованные домены), чтобы обойти эту проблему — эффект тот же, но контроль выше.

Q4: У меня включен глобальный прокси Clash, почему WebFetch все равно выдает ошибку?

Глобальный режим Clash не устанавливает переменные окружения автоматически. Claude Code — это процесс Node.js CLI, он считывает только переменные окружения типа HTTPS_PROXY и не определяет настройки системного прокси. Вам нужно явно экспортировать переменные прокси в shell profile или прописать их в блоке env в ~/.claude/settings.json.

Q5: WebFetch сработал, но результат неполный, только половина контента?

Это ограничение max_content_tokens в Claude Code. В правилах разрешений его нельзя изменить, но если вы вызываете инструмент web_fetch напрямую через API Claude (не через Claude Code CLI), вы можете установить "max_content_tokens": 100000 для увеличения объема захвата страницы. В таких сценариях рекомендуется прямое подключение к API через APIYI (apiyi.com) для большей гибкости.

Q6: Можно ли полностью избежать ошибки, отключив WebFetch?

Да. При запуске добавьте параметр:

claude --disallowedTools WebFetch

Или в settings.json:

{
  "permissions": {
    "deny": ["WebFetch"]
  }
}

В сочетании с разрешением Bash(curl:*), Claude автоматически начнет использовать curl, что для пользователей из Китая зачастую работает лучше.

Q7: Как настроить Claude Code в GitHub Actions / GitLab CI?

В CI-контейнерах на 100% рекомендуется отключать WebFetch — в контейнерах нет браузерного окружения, и preflight почти всегда будет падать. В то же время направьте API-запросы на стабильный узел APIYI (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 через сервис-прокси APIYI (apiyi.com) + локальный прокси для прохождения preflight на claude.ai + Bash curl в качестве резервного варианта (fallback). Это позволяет обойти 90% ошибок WebFetch.

План действий

Выполните эти 5 шагов в порядке приоритета:

  1. Настройка прокси: Установите HTTPS_PROXY + HTTP_PROXY и добавьте домен APIYI в NO_PROXY.
  2. Предварительная авторизация доменов: Добавьте часто посещаемые сайты в permissions.allow через WebFetch(domain:...).
  3. Обработка корпоративных CA: Если вы работаете в среде Zscaler/CrowdStrike, настройте NODE_EXTRA_CA_CERTS.
  4. Подготовка fallback: Разрешите Bash(curl:*), чтобы Claude автоматически переключался на него при возникновении проблем.
  5. Скрипт проверки состояния: Добавьте claude-code-doctor.sh в инструментарий вашей команды.

claude-code-webfetch-unable-to-verify-domain-fix-ru 图示

🎯 Финальный совет: Сетевые проблемы в Claude Code — это многоуровневая инженерная задача, где важна каждая деталь: прокси, сертификаты, правила доступа и приоритеты инструментов. Мы рекомендуем сначала наладить путь вызова API через APIYI (apiyi.com), так как это наиболее контролируемая часть SLA, а затем пошагово решать вопросы с preflight и CA для WebFetch. Платформа поддерживает все модели Claude и нативные инструменты, что упрощает проверку каждой настройки.


Автор: Техническая команда APIYI | Больше практических руководств по Claude Code на help.apiyi.com

Оставьте комментарий