配镜像仍报GitHub API错误,是因为镜像只代理packagist.org元数据和ZIP下载,不代理api.github.com请求;vcs包、dev分支、私有fork等场景仍直连GitHub API,若代理工具拦截Authorization头或Token权限不足(需repo非public_repo),就会静默失败。

不是镜像没配好,也不是网络差,而是 GitHub API 限流 + 代理工具双重拦截导致的静默失败。
为什么配了镜像还报 GitHub API 错误
Composer 配了 repo.packagist 镜像后,只加速包元数据(packages.json)和 ZIP 包下载,但以下操作仍直连 api.github.com:
- 解析
vcs类型包(如"type": "vcs", "url": "https://github.com/xxx/yyy")时查 commit、tag、branch - 下载未发布到 Packagist 的 dev 分支或私有 fork
- 某些插件(如已废弃的
hirak/prestissimo)绕过 Composer HTTP 客户端,直接调用系统curl
此时即使镜像 URL 正确,composer install 仍会卡在 Loading provider-*.json 或报 Could not fetch https://api.github.com/...。
代理工具干扰的真实表现与验证方式
代理工具(如 Clash、Surge、火绒、企业中间人代理)常偷偷拦截或改写 HTTPS 请求,尤其针对 Authorization 头。典型现象:
- 浏览器能打开
https://api.github.com/rate_limit,但curl -H "Authorization: token xxx" https://api.github.com/rate_limit返回401或超时 - 运行
composer install -vvv,日志里出现GET https://api.github.com/...但无后续响应 - 关闭代理后立刻成功,开代理就失败 —— 说明代理没透传认证头或证书校验失败
临时验证:执行 curl -v -H "Authorization: token YOUR_TOKEN" https://api.github.com/rate_limit,看是否返回 rate 字段及剩余次数。
GitHub OAuth Token 必须显式配置且权限完整
Token 不是可选优化项,是 GitHub 强制要求的身份凭证。错误配置等于没配:
- 必须用
repo权限(不是public_repo),否则私有 fork、子模块、某些 dist 下载会静默失败 - 必须写进全局
auth.json:composer config -g github-oauth.github.com <your_token_here> - 不能只写项目级
auth.json,除非加--auth参数,否则 Composer 默认不读 - 公司网络若走 HTTPS 中间人代理,需额外设置 PHP 的
openssl.cafile指向代理根证书,否则 TLS 握手失败
验证是否生效:运行 composer config -g github-oauth.github.com,输出应为你的 token 字符串,而非空或报错。
镜像与代理共存时的优先级陷阱
三者同时存在时,实际请求路径取决于配置层级和命令参数:
- 项目级
repositories字段存在 → 全局repo.packagist配置完全失效(不是覆盖,是跳过) - 命令行加了
--no-plugins→ 所有插件(包括可能劫持 GitHub 请求的)被禁用,强制走 Composer 原生逻辑 + 镜像 - 设置了
http-proxy但没配https-proxy→ HTTPS 请求(如 GitHub API)仍直连,代理只生效于 HTTP - CI 环境(如 GitHub Actions)中,每次构建都是干净环境,必须在 workflow 步骤里显式执行
composer config -g ...
最稳妥组合:进项目目录,运行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不带 -g),再 composer clear-cache,最后 composer install --no-plugins。这样既避开插件干扰,又确保镜像写入项目配置,不受全局状态影响。


















