答案是secure-http默认为true,强制拦截所有http://仓库地址;需用--global关闭并确保composer.json无http地址,或对单个仓库设allow_ssl_downgrade:true。

Composer 报 “The 'http://' URL is not allowed” 或类似提示,不是镜像地址写错了,而是 secure-http 全局开关为 true(默认值)时,它会直接拦截所有 http:// 开头的仓库地址——哪怕你只配了一个内网 HTTP 镜像,也会立刻报错退出。
为什么 composer config -g repo.packagist 看起来成功却没用?
因为 repo.packagist.org 这个配置项在 Composer 2.0+ 中已被移除,Packagist 是硬编码特殊处理的,改它等于白改。真正起作用的是全局安全开关 secure-http,它校验的是所有仓库 URL 的协议头,不区分官方还是私有源。
-
composer config -g repo.packagist.org https://packagist.org执行后,composer config -g --list根本不会显示这一行 - 抓包仍看到
http://packagist.org/packages.json请求?那说明你没关掉网络劫持或代理重定向,不是 Composer 配置问题 - 想验证是否生效:临时把
composer.json里某个自定义仓库改成"url": "http://example.com",再跑composer update -vvv—— 如果立刻报错并中断,说明secure-http确实开着
允许 HTTP 镜像的正确姿势(仅限可信内网)
必须关 secure-http,且只关一次;但注意:secure-http false 是全局行为,影响所有项目、所有仓库,不能按项目开关。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 全局关闭(开发环境临时用):
composer config --global secure-http false - 单次命令绕过(更安全):
composer update --no-secure-http - 对单个 HTTP 仓库放宽限制(推荐):在
composer.json的repositories数组中,给该仓库对象加"allow_ssl_downgrade": true字段,不要写到根节点 - 错误写法示例:
"options": { "ssl": { "verify_peer": false } }—— 它绕不过协议拦截,只跳过证书校验,二者不等价
HTTPS 镜像连不上?先别急着关 secure-http
报 cURL error 60 或 SSL certificate problem,大概率是本地 OpenSSL 信任库过期,或 PHP 没指向有效的 CA 证书包,而不是镜像本身有问题。
- 运行
php -r "print_r(openssl_get_cert_locations());",看default_cert_file路径是否存在、可读 - 若为空或路径无效,下载最新
cacert.pem(来自 curl.se),保存后在php.ini中设置openssl.cafile=/path/to/cacert.pem,重启 PHP - 检查系统时间:
date,偏差超过 5 分钟会导致 SSL 握手失败 - 某些国内镜像(如老部署的阿里云节点)可能证书链不全,报
unable to get local issuer certificate—— 这是对方服务器配置缺陷,应反馈修复,而非本地降级
真正容易被忽略的是:secure-http 控制的是「出站请求的协议合法性」,它不管服务端是否真的支持 HTTPS,也不管中间网络是否偷偷降级。你配了 https://,但公司网关把它转成 HTTP 再发出去,Composer 依然认为合法 —— 所以报错时,先抓包或 curl -v 看真实发出的请求协议和响应状态,比反复调 Composer 配置更直接。

















