composer config secure-http false 未生效是因为该配置需加 --global 参数写入全局配置,且 composer 2.5+ 默认忽略该配置,须配合环境变量 composer_no_secure_http=1 或命令行 --no-secure-http 使用,并确保 composer.json 中所有仓库 url 为 https 或已移除 http 源。

composer config secure-http false 为什么没生效
因为 secure-http 是全局配置项,直接在项目目录下运行 composer config secure-http false 只会写入当前项目的 composer.json,而 Composer 优先读取全局配置(COMPOSER_HOME/config.json),项目级配置不覆盖它。
- 正确做法是加
--global参数:composer config --global secure-http false - 执行后检查是否写入成功:
composer config --global --list | grep secure-http,应输出secure-http=false - 如果之前手动改过
~/.composer/config.json,注意 JSON 格式必须合法,多一个逗号或引号都会让整个配置失效
禁用 secure-http 后 still getting “You are using an insecure protocol”
这个提示不是来自 secure-http 配置本身,而是 Composer 在解析 repositories 时对源地址的硬性校验 —— 即使全局关了 secure-http,只要 composer.json 里写了 "url": "http://xxx" 这种非 HTTPS 源,仍会报错并拒绝加载。
- 必须同时确保所有自定义仓库(
repositories)的url字段是https://开头,或干脆删掉该仓库 - 若确需用 HTTP 源(如内网测试镜像),可临时用
--no-secure-http参数绕过:composer update --no-secure-http - 注意:该参数只对当次命令生效,且从 Composer 2.5+ 开始才支持;低于此版本只能靠改全局配置 + 清缓存
composer clear-cache 之后还是走 HTTPS fallback
Composer 缓存的是包元数据(packages.json 等),不是配置。禁用 secure-http 后仍走 HTTPS,大概率是因为你正在用的镜像源(比如 packagist.org 的国内镜像)本身已强制跳转 HTTPS,跟本地配置无关。
- 验证方式:用
curl -I http://packagist.org/packages.json看是否返回301 Moved Permanently到 HTTPS 地址 - 真正要测 HTTP 源是否可用,得自己搭一个本地 HTTP 服务(如 Python 的
python3 -m http.server 8000),然后在repositories中指定http://localhost:8000 - 别忘了关掉系统级 HTTPS 强制(如某些 Linux 发行版的
httpredir.debian.org重定向规则)
PHP 8.1+ + Composer 2.5 下 secure-http false 不起作用
这不是 bug,是设计变更:Composer 2.5 默认忽略 secure-http 配置,除非显式启用 --no-secure-http 或设置环境变量 COMPOSER_NO_SECURE_HTTP=1。
- 推荐方式是设环境变量,一劳永逸:
export COMPOSER_NO_SECURE_HTTP=1(写入~/.bashrc或~/.zshrc) - Windows 用户用
set COMPOSER_NO_SECURE_HTTP=1(CMD)或$env:COMPOSER_NO_SECURE_HTTP="1"(PowerShell) - 注意:环境变量优先级高于
config --global,但低于命令行参数;如果 CI 脚本里混用了,容易互相覆盖










