“http connectivity to packagist: fail”是dns劫持的典型信号,内网常因防火墙或教育网劫持packagist.org域名导致解析失败;应优先用dig/curl验证dns,再执行composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/配置国内镜像源。

composer diagnose 报 “http connectivity to packagist: FAIL” 是 DNS 劫持的典型信号
内网环境(尤其企业防火墙或教育网)常对 packagist.org 域名做 DNS 劫持,返回错误 IP 或空响应,导致 composer diagnose 中 HTTP/HTTPS 连通性检查直接失败。此时你可能看到:
Checking http connectivity to packagist.org: FAILcURL error 7: Failed to connect to packagist.org port 80: Connection refused- 但浏览器能打开
https://packagist.org—— 因为浏览器走 HTTPS + SNI,而diagnose的 HTTP 检查更早暴露 DNS 问题
别急着改代理或重装 PHP;先确认是不是 DNS 层面被污染。
用 curl 和 dig 快速验证 DNS 是否被劫持
在终端运行这两条命令,比看 diagnose 输出更底层、更准:
-
dig packagist.org +short—— 查看返回的 IP 列表。若返回127.0.0.1、0.0.0.0或明显非官方的 IP(比如国内某 CDN 的私有段),基本可断定 DNS 劫持 -
curl -Iv http://packagist.org—— 观察是否卡在Resolving阶段,或返回Connection refused而非301/200 - 对比:
curl -Iv https://packagist.org—— HTTPS 可能成功,因为 TLS 握手绕过了部分中间劫持逻辑
注意:diagnose 的 HTTP 检查不走 HTTPS 升级,所以它比浏览器更“诚实”地暴露 DNS 问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
绕过 DNS 劫持的三种实操路径
不是所有方案都适合你的网络策略,按优先级排序:
-
首选镜像源:执行
composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/,再跑composer diagnose。阿里云等镜像已预解析好 IP,且多数内网允许访问其域名(如mirrors.aliyun.com) -
hosts 强制映射:从可信网络(如手机热点)获取真实 IP:
dig @8.8.8.8 packagist.org +short,然后写入本地/etc/hosts(macOS/Linux)或C:\Windows\System32\drivers\etc\hosts(Windows),格式如:137.74.169.73 packagist.org -
临时换 DNS:仅测试用,不推荐长期依赖。Linux/macOS 执行
sudo networksetup -setdnsservers Wi-Fi 1.1.1.1 8.8.8.8;Windows 可在网卡属性中手动设置。改完记得sudo dscacheutil -flushcache或ipconfig /flushdns
切记:如果项目 composer.json 里硬编码了 "repositories",它会覆盖全局镜像配置,必须删掉或同步改成镜像地址。
为什么 --retries 或 COMPOSER_NETWORK_TIMEOUT 对 DNS 劫持无效
很多人加了 --retries=10 或设了超时仍失败,是因为问题不在传输层,而在解析层:
- DNS 查询本身就有默认超时(通常 5 秒),
diagnose不重试 DNS,只重试 HTTP 请求 -
COMPOSER_NETWORK_TIMEOUT控制的是连接建立后等待响应的时间,DNS 失败连 TCP 握手都触发不了 - 一旦
gethostbyname()返回错误,PHP cURL 就直接报错,Composer 无从重试
真正要盯住的,是 diagnose 输出里那行 Checking http connectivity to packagist.org —— 它失败了,就说明 DNS 或基础路由有问题,别往下调参数,先查 IP 解析。










