Composer 报 403 Forbidden 主因是 GitHub API 认证失效或限流,非服务器权限问题;需配置有效的 GitHub Personal Access Token 并确保其未过期、未被撤回、权限充足(含 repo 和 read:packages),国内用户还需同步配置镜像源。

Composer 出现 403 Forbidden,绝大多数情况不是权限设置问题,而是 GitHub 认证失效或网络策略拦截——先别急着改服务器 chmod 或 SELinux。
为什么 composer update 报 403?不是没权限,是没“身份”
GitHub 对未认证请求有严格限流:每小时最多 60 次 API 调用。一旦超限,Composer 拉取包元数据(如 composer.json 描述、版本列表)时就会收到 403,错误里常带 rate limit exceeded 或 API rate limit exceeded for xxx.xxx.xxx.xxx。这不是你服务器文件权限不对,也不是 Apache/Nginx 配置错了,是 GitHub 拒绝了你的“匿名访客”身份。
- 现象:执行
composer update或composer require时卡在某个包,报错含403 Forbidden和github.com字样 - 验证方式:运行
curl -I https://api.github.com/rate_limit,看响应头中X-RateLimit-Remaining是否为 0 - 真实原因:没配 Token、Token 过期/被撤回、Token 权限不足(缺
repo)、或用了企业版 GitHub 却配置了github.com
快速修复:配置 github-oauth 并确认生效
给 Composer 一个合法的 GitHub 身份,它就能走认证通道,每小时 5000+ 请求,基本告别 403。
- 登录 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token
- 填
Note(如composer-cli),勾选repo(读私有库必需)和read:packages(读 GitHub Packages) - 生成后立即复制,页面刷新即消失 —— 别存代码里,别传 Git,别发群
- 执行:
composer config --global github-oauth.github.com YOUR_GITHUB_TOKEN - 验证是否写入:
composer config --global --list | grep github-oauth,应看到非空值
国内用户额外注意:镜像源 + GitHub Token 必须同时配对
只换 Packagist 镜像(如清华源)能加速下载 zip 包,但无法绕过 GitHub API 限流——因为 Composer 仍需访问 api.github.com 获取包信息。所以 Token 和镜像必须共存。
- 切镜像源(推荐清华):
composer config -g repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/(末尾斜杠不能少) - 确保 Token 已配(上一步已做),否则清华源也拿不到 GitHub 上的包描述
- 如果公司用 GitHub Enterprise,把
github.com换成你企业的域名,例如:composer config --global github-oauth.ghe.example.com YOUR_TOKEN - CI 场景(如 GitHub Actions):用
secrets.GITHUB_TOKEN注入,不要硬写进脚本
排除干扰:别让缓存、证书或代理“假装”是 403
有些 403 实为表象,底层是其他问题被错误映射。尤其当错误不固定、或换网络就消失时,要往这三处查。
- 清缓存再试:
composer clear-cache,旧缓存可能存了过期的 403 响应 - cURL 证书失败会伪装成 403/404:
php -r "print_r(openssl_get_cert_locations());"看 CA 文件路径,若文件陈旧(如修改时间早于 2022 年),需更新系统 CA 或在php.ini中设openssl.cafile - 代理干扰:检查是否误启了全局代理,
env | grep -i proxy查环境变量;如有必要,临时禁用:unset HTTP_PROXY HTTPS_PROXY
最常被忽略的是:以为配了 Token 就一劳永逸,结果 Token 被手动 revoke 了,或者 GitHub 账号启用了 SSO(需要额外授权),这时候 composer update 依然会静默失败。遇到反复 403,优先打开浏览器访问 https://github.com/settings/tokens 确认 Token 状态。










