Composer 2.0+ 默认强制 HTTPS,若镜像仅支持 HTTP,需在 composer.json 的仓库配置中显式添加 "secure-http": false 才能启用 HTTP;全局配置无效,推荐改用 HTTPS 镜像或反向代理。

Composer 默认走 HTTPS,但某些镜像不支持 HTTPS 重定向
Composer 自 2.0 起默认强制使用 HTTPS 协议请求包源(包括 packagist.org 和所有配置的 repo),如果镜像站仅提供 HTTP 服务(如早期国内某些自建镜像),composer install 会直接报错:Connection refused 或 cURL error 60: SSL certificate problem。这不是 Composer “不支持 HTTP”,而是它拒绝降级——除非你显式允许。
如何让 Composer 使用 HTTP 镜像(不推荐,仅限内网/测试环境)
必须绕过 Composer 的安全策略,且仅对特定仓库生效。全局禁用 HTTPS 会破坏安全性,不建议。
- 在
composer.json中为镜像仓库添加"secure-http": false字段:
{
"repositories": [
{
"type": "composer",
"url": "http://packagist.phpcomposer.com",
"secure-http": false
}
],
"require": {}
}
- 执行
composer clear-cache清除缓存,否则旧的 HTTPS 记录可能仍被复用 - 注意:该设置只对当前项目生效;若用
composer config -g全局设置,secure-http不支持全局配置,强行写入会被忽略
更安全的做法:换用支持 HTTPS 的镜像或自建 HTTPS 代理
主流镜像(如阿里云、腾讯云、华为云)均已支持 HTTPS,且证书有效。错误往往出在配置了过时的 HTTP 地址却没更新协议。
- 正确配置阿里云镜像(HTTPS):
composer config -g repo.packagist https://mirrors.aliyun.com/composer/
- 验证是否生效:
composer config -g repo.packagist应输出带https://的地址 - 若公司内网镜像只有 HTTP,应在反向代理层(如 Nginx)加一层 HTTPS 终结,而非让 Composer 直连 HTTP —— 这样既满足 Composer 安全要求,又避免暴露明文流量
调试时如何确认 Composer 实际用了什么协议
Composer 不会主动打印请求 URL,但可通过环境变量开启详细日志:
- 运行:
COMPOSER_HTTP_PROXY=1 composer -v install 2>&1 | grep -i 'GET https\|GET http' - 或抓包:
tcpdump -i lo port 443 or port 80 -w composer.pcap(Linux/macOS),再用 Wireshark 查看实际连接目标和协议 - 关键点:即使你在
composer.json写了http://,只要secure-http: false缺失,Composer 仍会尝试 HTTPS 并失败——不是“没走 HTTP”,而是根本没发 HTTP 请求
secure-http 这个开关必须显式关掉;而生产环境里,硬开 HTTP 更容易被忽略 TLS 验证失败背后的真实网络路径问题。










