删代理不恢复镜像源,因Composer源地址由环境变量>项目级composer.json>全局配置决定,需同步清除repos.packagist、repo.packagist、COMPOSER_REPO_PACKAGIST及运行composer clear-cache验证。

直接删掉代理配置不会自动还原镜像源,必须同步处理镜像字段、环境变量和缓存三者,否则仍走旧源。
为什么删了 proxy 还是连不上 packagist.org
Composer 的网络行为由四层叠加决定:环境变量 > 项目级 composer.json > 全局 config.json > 默认逻辑。代理(http-proxy / https-proxy)只是其中一层,它只影响请求转发,不控制源地址本身。即使你清空了所有 proxy 配置,只要 repos.packagist 或 repo.packagist 字段还存在,或者 COMPOSER_REPO_PACKAGIST 环境变量没 unset,Composer 就仍会向镜像域名发起请求——然后被你的代理拦住或超时。
- 代理配置本身不决定“从哪拉包”,只决定“请求发给谁中转”
- 删
http-proxy后,Composer 会直连镜像地址;若镜像已失效或被墙,就卡在 DNS 或连接阶段 - 常见误判:看到
Connection timed out就以为是代理问题,实际是镜像 URL 写错或未清缓存
取消代理的同时必须清理镜像字段
代理和镜像常被一起配置,但它们存储在不同字段里,需分别清除:
- 删全局代理:
composer config -g --unset http-proxy和composer config -g --unset https-proxy - 删全局镜像(复数写法,Composer 2.2+ 生效):
composer config -g --unset repos.packagist - 删旧式镜像(单数写法,兼容老版本):
composer config -g --unset repo.packagist - 检查是否残留私有源干扰:
composer config -g repositories,若输出含非空对象,需手动确认是否要保留
注意:composer config -g --unset repositories 会删整个仓库列表,可能误杀私有 VCS 源,不推荐无差别执行。
环境变量比配置文件优先级更高
即使你删光了所有配置,只要环境变量还在,镜像就照常生效:
- Linux/macOS 查看:
env | grep COMPOSER_REPO - Windows 查看:
echo %COMPOSER_REPO_PACKAGIST% - Linux/macOS 清除:
unset COMPOSER_REPO_PACKAGIST - Windows 清除:
set COMPOSER_REPO_PACKAGIST=
这个变量一旦设置,Composer 完全忽略 config.json 里的任何镜像字段,且不提示。CI/CD 脚本或 shell profile 中容易悄悄写入,建议检查 ~/.bashrc、~/.zshrc 或 GitHub Actions 的 env: 块。
缓存不清 = 配置白改
Composer 缓存的是完整的元数据快照(如 packages.json),不是简单 HTTP 缓存。换源后不清理,它仍用旧镜像里缓存的包列表去请求官方域名,导致 composer require 找不到包或版本错乱:
- 必须运行:
composer clear-cache - 验证是否真走官方源:
composer require monolog/monolog --no-install -vvv 2>&1 | grep "GET https://" - 正确日志应含
https://repo.packagist.org/packages.json,而非任何mirrors.*域名
Windows 用户若提示 Permission denied,大概率是杀毒软件锁了 %APPDATA%\Composer\cache\,需临时关闭或管理员权限运行。
最易被忽略的是:项目级 composer.json 里的 repositories 字段,哪怕只写了 "repositories": [],也会让全局所有配置失效。别只盯着代理和全局 config,进项目目录跑一遍 composer config repositories 才算真正闭环。











