必须同时配置镜像和代理:镜像换源但需代理出网,代理不配则镜像请求超时,镜像不配则代理仍连官方源;二者缺一导致静默失效。

为什么只配镜像或只配代理都不行
镜像源和代理是两个独立但必须协同的环节。国内镜像(如 https://mirrors.aliyun.com/composer/)只是把包元数据和 ZIP 文件换了个下载地址,但它本身仍是 HTTPS 请求;而企业内网、校园网或 CI 环境中,HTTPS 流量默认被拦截或需走代理才能出网。只设镜像不配代理,Composer 会尝试直连镜像站——在受限网络下直接超时或卡在 Loading composer repositories;只设代理不换镜像,则仍走 packagist.org,延迟高且易失败。
必须同时执行的两条 config 命令
Composer 对 HTTP 和 HTTPS 代理硬分离,漏掉任一都会静默失效:
composer config -g http-proxy http://127.0.0.1:8080composer config -g https-proxy http://127.0.0.1:8080
注意:https-proxy 的值仍要用 http:// 开头(哪怕代理服务监听 TLS 端口),填 https:// 或省略协议头会导致配置被忽略。验证方式:运行 composer config -g http-proxy 和 composer config -g https-proxy,两者都应输出完整 URL。
镜像配置必须带三要素且末尾有斜杠
仅执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 不够,缺一不可:
- 参数必须带
-g(否则只影响当前项目) - 键名必须是
repo.packagist(不是repos.packagist或packagist.org) - 中间的
composer是type值,不能省略 - URL 必须以
https://开头,且末尾带/(少斜杠会拼出/composerpackages.json导致 404)
验证是否生效:运行 composer config -g repo.packagist,输出必须是类似 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} 的完整 JSON,空、null 或报错说明没写进去。
密码含特殊字符时必须 URL 编码
代理认证若含 @、/、: 等字符,不编码就会被 Composer URI 解析器截断:
- 错误示例:
http://user:pa@ss/word@127.0.0.1:8080→ 实际解析出的密码只有pa - 正确做法:对用户名或密码单独执行
rawurlencode(),例如:php -r "echo rawurlencode('pa@ss/word');"→ 输出pa%40ss%2Fword - 最终代理地址写成:
http://user:pa%40ss%2Fword@127.0.0.1:8080
这个细节极容易被忽略,现象是代理配置看似成功,但 composer install 仍卡住,且无明确报错。











