Composer报403主因是GitHub API超限未配Token或镜像源失效;先看报错URL是否含api.github.com或镜像域名,再用composer update -vvv和curl验证,切官方源或换清华/阿里镜像可快速定位修复。

Composer 报 403 不是权限不足,而是你被服务器“认出来且拒之门外”了——核心原因就两个:GitHub API 调用超限没带 Token,或镜像源配置错误/已失效。
怎么快速判断是 GitHub 还是镜像源的问题
先看报错 URL 是否含 api.github.com 或 github.com;再运行 composer update -vvv,观察卡在哪条请求上。如果错误出现在类似 https://api.github.com/repos/vimeo/psalm/zipball/... 的地址,基本锁定 GitHub 认证问题。如果出在 https://mirrors.aliyun.com/composer/... 或 https://packagist.phpcomposer.com/...,就是镜像源异常。
快速验证 GitHub 限流:用 curl -I -H "Accept: application/vnd.github.v3+json" https://api.github.com/rate_limit 查 X-RateLimit-Remaining,为 0 就是它。
- 若返回
403 AccountArrear或访问packagist.phpcomposer.com直接失败,说明镜像已下线(该站自 2022 年起不可用) - 若切回官方源
composer config -g repo.packagist composer https://packagist.org后正常,那原镜像就是假死或反代 403 - 注意:国内推荐稳定镜像只有两个——阿里云
https://mirrors.aliyun.com/composer/和清华源https://mirrors.tuna.tsinghua.edu.cn/composer/(末尾斜杠不能少)
github-oauth 配置为什么总不生效
最常见原因是域名写错:github.com 不能写成 api.github.com 或 www.github.com。Composer 内部只按 host 字符串精确匹配,不解析子域继承关系。配错后 composer config -g --list | grep github-oauth 看到的会是 "github-oauth": {"api.github.com": "..."},这完全无效。
- 正确命令:
composer config --global github-oauth.github.com ghp_xxx... - Token 必须勾选
repo和read:packages,其他权限一概不用 - 生成后立即复制,关页即丢;存入
~/.composer/auth.json后建议执行chmod 600 ~/.composer/auth.json - CI 环境别硬编码,用
GITHUB_TOKEN环境变量注入,Composer 会自动读取
镜像源报 403 的真实原因和绕过方式
部分镜像(如旧版 Laravel China、某些企业代理)会在上游不可达时伪造 403 响应,而不是透传 502/404,导致误判。还有一类是 User-Agent 拦截:Composer/2.x 被防火墙规则直接拒绝。
- 用
curl -v -A "Composer/2.5" https://mirrors.aliyun.com/composer/packages.json模拟请求,看是否同样 403 - 临时覆盖 UA:
composer config -g http.header "User-Agent: Mozilla/5.0 (compatible; Composer)" - 检查代理配置:
composer config -g http.proxy和https.proxy,确认没泄露内部 auth token - 清理缓存前先看属主:
ls -la ~/.composer/cache,若含root,执行sudo chown -R $USER ~/.composer/cache
真正难定位的是 GitHub Token 和镜像源问题交织:比如你配了 Token,但镜像源又拦截了带 Authorization 头的请求,结果还是 403。这时候必须关掉镜像直连 GitHub 验证,否则永远在两个方向间反复横跳。


















