composer无法连接github的根本原因是网络拦截,而非配置错误;需统一git协议为https、正确配置git代理、严格设置auth.json权限及github token作用域。

Composer 无法连接 GitHub 不是 Composer 自己的问题,而是它在 HTTPS 握手、DNS 解析或 TCP 连接阶段被中间网络设备(如企业防火墙、代理、NAT 网关)主动中断了。 常见报错包括 Connection reset by peer、Failed to connect to github.com port 443、Could not resolve host github.com,本质都是系统级网络策略拦截,不是配置写错了。
为什么改 composer.json 的 repositories 没用
很多人在 composer.json 里加了阿里云镜像源,但 composer install 依然卡在 Cloning into 'xxx' —— 因为镜像只加速元数据(packages.json)和 dist 包下载,而真正克隆代码时,Composer 仍会按包定义里的 source.url(通常是原始 GitHub HTTPS 地址)发起 git clone 请求。
- 镜像不代理 Git 协议(
git://或ssh://git@github.com),这类地址在国内基本不可用 - 即使你配了 HTTPS 镜像,
source.url是https://github.com/xxx/yyy.git,Composer 就一定走这个地址,不会自动替换成镜像 - 私有仓库、
"type": "vcs"包、或 fork 后未改source的包,完全绕过 Packagist,直连 GitHub
Git 全局代理比 Composer 代理更可靠
Composer 底层调用 git clone,所以最稳的代理方式是让 Git 本身走代理,而不是只配 Composer 的 http-proxy。否则会出现 Composer 认为自己“已配代理”,但实际 git clone 仍裸连失败。
- 设 HTTP(S) 代理(适用于大多数科学上网工具):
git config --global http.proxy http://127.0.0.1:7890和git config --global https.proxy http://127.0.0.1:7890 - 若代理需认证,写成
http://user:pass@127.0.0.1:7890 - 仅对当前项目生效(不影响其他 Git 操作):去掉
--global,在项目目录下运行命令 - SSH 地址(
git@github.com:xxx/yyy.git)不走 HTTP 代理,必须先转成 HTTPS(见下一条)
强制 GitHub 地址统一走 HTTPS 协议
GitHub 默认支持 git:// 和 ssh://,但这两种协议在国内极不稳定。Composer 提供了协议重写机制,可把所有 GitHub 地址自动转成 HTTPS,再配合 Git 代理才能真正生效。
- 启用重写:
composer config --global github-protocols https - 执行后,
git@github.com:xxx/yyy.git和git://github.com/xxx/yyy.git都会被转成https://github.com/xxx/yyy.git - 必须确保 Git 已配置
https.proxy,否则只是换了个协议继续超时 - 验证是否生效:
composer show vendor/package,看source字段是否已变成https://开头
别忽略 auth.json 权限和 token 作用域
配了 GitHub Token 却仍报 403 rate limit exceeded?大概率是 auth.json 权限不对,或 token 缺少必要权限。
-
auth.json文件权限必须是600(chmod 600 ~/.composer/auth.json),否则 Composer 会静默忽略它 - Token 必须勾选
repo(不是public_repo),否则读取 fork 仓库或某些元数据时会静默失败 - 公司网络若拦截
Authorization请求头,token 会被丢弃,现象同未配置;可用curl -H "Authorization: token xxx" https://api.github.com/rate_limit手动验证 - CI 环境(如 GitHub Actions)推荐用
COMPOSER_AUTH环境变量注入,避免硬编码或权限泄漏
真正卡住你的,往往不是“要不要配代理”,而是 Git 协议没转 HTTPS、auth.json 权限不对、或 token 权限不足——这三个点漏掉任何一个,前面所有操作都白做。











