代理不能替代镜像源,因二者作用层面不同:镜像改元数据源地址,代理改流量转发路径;二者互斥,混配会导致“Loading composer repositories”卡死、静默失败或TLS握手错误。

不能用代理“替代”镜像源——它们解决的是不同层面的问题,强行混用反而导致 Loading composer repositories 卡死、静默失败或 TLS 握手错误。
为什么代理不能替代镜像源
镜像源改的是 Composer 去哪拿元数据(packages.json、p2/xxx.json),代理改的是 HTTP/HTTPS 流量怎么转发。两者互斥:设了 repo.packagist,http-proxy 和 https-proxy 就被完全忽略;开了代理,镜像配置就形同虚设。
- 国内用户卡在
Loading composer repositories,90% 是因为同时配了镜像和代理,结果 Composer 只走镜像直连,代理字段压根不生效 - 镜像本身不参与 TLS 握手,也不支持客户端证书(mTLS);代理才负责透传 HTTPS CONNECT 隧道——所以要连 mTLS 私有源,必须用代理,镜像做不到
- 镜像站地址(如
https://mirrors.aliyun.com/composer/)仍是 HTTPS 地址,如果公司网络策略强制所有 HTTPS 流量过代理,那即使用了镜像,没配https-proxy一样连不上
真要用代理时,必须清空镜像并严格配齐两个字段
想让 Composer 走代理,第一步永远是删掉镜像配置,否则代理不会启动:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer config -g --unset repo.packagist(注意不是repos.packagist或packagist.org) - 必须同时设置
http-proxy和https-proxy,缺一不可;只设前者,HTTPS 请求会 fallback 直连,卡住无报错 -
https-proxy的值必须以http://开头,哪怕代理服务监听的是https://127.0.0.1:8080——填https://或漏协议头会导致静默失效 - 用户名或密码含
@、/、:时,必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword;可用php -r "echo rawurlencode('pa@ss/word');"生成
代理环境下 TLS 握手失败的典型表现和修复
常见错误是 cURL error 28、静默超时、或 SSL certificate problem,本质不是网络慢,而是证书不被信任:
- 运行
composer config -g cafile /path/to/your-root.pem指向公司根证书(不要用系统默认的ca-bundle.crt) - 同步调高容忍度:
composer config -g http.connect_timeout 60和composer config -g http.timeout 600 - Windows + WSL2 用户常因时间不同步导致握手失败,运行
sudo hwclock -s同步主机时间 - 临时验证是否真走代理:加
-n -vvv运行composer install,日志里出现Proxy CONNECT才算成功
企业内网该选镜像还是代理
绝大多数情况应优先用镜像——它不依赖代理进程存活,无 TLS 证书问题,也避免认证类型不匹配(比如 NTLM):
- 已有阿里云、腾讯云或私有 Artifactory 镜像,别配代理;直接切源更稳
- 只有两种场景必须用代理:① 公司内网强制所有 HTTPS 流量过统一出口(此时镜像站也被拦截);② 要访问启用了 mTLS 的私有 Packagist(镜像无法透传客户端证书)
- NTLM 代理需本地起中转服务(如 cntlm/px),监听
127.0.0.1:3128,再让 Composer 连这个地址;Composer 原生不支持 NTLM 认证
最容易被忽略的一点:镜像 URL 必须可被代理访问——比如你配了清华镜像但公司 DNS 不解析 mirrors.tuna.tsinghua.edu.cn,或者代理拦截了 User-Agent,都会返回 403 或超时,而不是提示配置错误。

















