必须配置 github personal access token 才能解决 composer 的 403 或 “rate limit exceeded” 错误;镜像源仅加速 packagist 元数据和 zip 包下载,无法代理 github api 请求(如 /repos/.../commits、/tags),而 dev-* 分支、vcs 类型、私有库等解析仍直连 api.github.com,未认证时受限于每小时 60 次配额。

镜像源不能绕过 GitHub API 限流,必须配 Token 才能解决 403 或 “rate limit exceeded” 错误。 阿里云、腾讯云等 Composer 镜像只加速 packagist.org 元数据和 ZIP 包下载,但 Composer 在解析 "type": "vcs"、dev-* 分支、私有库或未收录包时,仍会直连 api.github.com——这部分请求不受镜像代理,也不走镜像 URL。
为什么换镜像后还报 403 或 rate limit exceeded
常见误解是“只要换了 packagist 镜像,GitHub 就不碰了”。实际不是:
- 镜像只接管
packages.json和已打包的.zip下载,不接管 GitHub API 的/repos/{owner}/{repo}/commits、/tags、/zipball/等调用 - 只要
composer.json里写了"monolog/monolog": "dev-main"或自定义了"type": "vcs"指向https://github.com/...,Composer 就会发认证请求到 GitHub API - 如果没配 Token,哪怕镜像正常,也会在 fetch commit 时卡住并报
403 Forbidden或API rate limit exceeded
必须配 GitHub Token,且权限和写法要对
Token 是唯一能提升 GitHub API 配额(从 60 次/小时 → 5000 次/小时)并启用身份识别的方式:
- 生成 Token 时,必须勾选
repo(不是仅public_repo),否则访问 fork 库、私有库或某些组织仓库仍失败 - 命令必须是
composer config --global github-oauth.github.com <your_token></your_token>—— 注意域名是github.com,不是api.github.com - 配置后检查是否生效:
composer config --global github-oauth.github.com应输出 token 前几位;再加-v跑composer install,日志中出现Using GitHub token from configuration才算真正启用 - Linux/macOS 下确保
~/.composer/auth.json权限为600,否则 Composer 静默忽略该文件
镜像 + Token 要配合使用才稳
单独配 Token 能解限流,但国内网络下仍可能因 TLS 握手、DNS 或 CDN 导致超时;单独换镜像能加速公开包,但挡不住 GitHub API 报错。两者结合才是生产环境标配:
- 全局设镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾斜杠不能少) - 全局配 Token:
composer config --global github-oauth.github.com <token></token> - 删掉
vendor/和composer.lock后重试,避免锁文件里残留旧 URL 导致 fallback 失败 - CI 环境不要硬编码 Token,改用
GITHUB_TOKEN环境变量注入,并在脚本中执行composer config --global github-oauth.github.com "$GITHUB_TOKEN"
最容易被忽略的是:Token 配了但权限不对、auth.json 权限不对、或 Composer 版本太老(低于 2.2.0 可能忽略认证逻辑)。这些情况下,错误现象和没配 Token 完全一致,但排查方向完全不同。











