镜像与代理互斥,因composer优先使用镜像url直连,忽略代理配置;二者共存会导致404或fallback至官方源。

不能在中文镜像配置里“设置代理”——这两件事互斥,强行混用会导致 404、fallback 到官方源,或部分请求走镜像、部分被代理劫持。
为什么镜像和代理不能共存
Composer 的 repo.packagist.org URL 和 http-proxy/https-proxy 是两条完全独立的路径:
- 配了阿里云/清华镜像(如
https://mirrors.aliyun.com/composer/),Composer 就直接连这个地址,完全不经过你设的http-proxy或https-proxy - 配了
http-proxy和https-proxy,Composer 就只连repo.packagist.org(默认国际源),所有流量走你本地代理端口 - 二者同时存在:Composer 会优先用镜像 URL,但某些元数据请求(比如
packages.json的 fallback 探测)可能仍触发代理逻辑,结果目标域名不匹配,返回 404 或静默失败
该选镜像还是代理?看你的网络环境
判断依据不是“哪个快”,而是“你能不能直连镜像站”:
- 能
curl -I https://mirrors.aliyun.com/composer/packages.json返回200 OK→ 直接换镜像,不要配任何 proxy - curl 超时 / 返回
502/ 被重定向到公司登录页 → 说明镜像站被拦截,此时必须走代理,且必须清掉镜像配置 - CI 环境中只有代理出口(如 Jenkins slave 在内网)→ 只配
http-proxy+https-proxy,别碰repo.packagist.org
清镜像后正确配代理的硬性条件
漏掉任意一条,composer install 就卡在 Loading composer repositories,不报错、不超时、只干等:
-
composer config -g http-proxy http://127.0.0.1:7890和composer config -g https-proxy http://127.0.0.1:7890必须都执行,缺一不可 -
https-proxy的值**必须是http://开头**,填https://或省略协议头会静默失效 - 密码含
@、:、/时,必须用php -r "echo rawurlencode('your_pass');"编码后再拼入 URL - 验证命令:
composer config -g --list | grep -E "(http|https)-proxy",输出必须有且仅有两行,格式合法
NTLM 代理(如 Windows 域环境)怎么办
Composer 原生不支持 NTLM,设了 http-proxy 也会返回 407 Proxy Authentication Required:
- 唯一可行方案:本地起
cntlm或px,监听127.0.0.1:3128并处理 NTLM 认证 - 然后只配
composer config -g http-proxy http://127.0.0.1:3128和composer config -g https-proxy http://127.0.0.1:3128 - 临时验证:
curl -x http://127.0.0.1:3128 -I https://packagist.org/packages.json,如果 curl 也报 407,说明中转代理没配好
最常被忽略的一点:改完配置后,正在运行的 composer install 进程不会自动 reload,必须手动中止再重试。











