composer如何配置secure-http_composer禁用HTTPS安全限制【测试】

5次阅读

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

composer如何配置secure-http_composer禁用HTTPS安全限制【测试】

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 脚本里混用了,容易互相覆盖

实际测试时最常卡在「以为配了就完事」—— 全局配置、仓库 URL、环境变量、Composer 版本四者必须全部对齐,漏一个,HTTP 源照样被拦。

text=ZqhQzanResources