因为Packagist全量走HTTPS,而Composer协议分离路由:仅配http-proxy无法处理HTTPS请求,必须同时配置https-proxy(均用http://格式)才能建立CONNECT隧道,否则请求被直连拦截或超时卡在“Loading composer repositories”。

为什么只配 http-proxy 项目仍连不上 Packagist
因为 Packagist 全量走 HTTPS,而 Composer 对代理是协议分离路由的:http-proxy 只处理 HTTP 请求,https-proxy 才负责建立 HTTPS 的 CONNECT 隧道。漏掉后者,请求会被系统直连策略拦截或超时卡在 “Loading composer repositories” 阶段,且无明确报错。
必须同时配置两项,值都用 http:// 协议格式(不是 https://):
composer config --global http-proxy http://127.0.0.1:8080composer config --global https-proxy http://127.0.0.1:8080
注意:Composer 不读取系统级 HTTP_PROXY 环境变量,全局或项目级 config 命令写入的配置才生效。
项目级代理配置如何覆盖全局设置
在项目根目录的 composer.json 中加 config 字段即可局部覆盖,优先级高于全局配置:
{
"config": {
"http-proxy": "http://192.168.1.100:8080",
"https-proxy": "http://192.168.1.100:8080",
"secure-http": false
}
}
secure-http 设为 false 是为了允许非 HTTPS 私有源(如内网 HTTP Artifactory),但仅限可信内网环境;生产项目不建议长期关闭。
验证是否生效:运行 composer config --list(不带 --global),检查输出中 http-proxy 和 https-proxy 的值是否为你刚写的地址。
私有仓库 URL 后缀斜杠缺失导致 404
Artifactory、Satis 或自建 Nginx 静态服务的 Composer 仓库 URL,末尾斜杠 / 是强制要求。少一个,Composer 会错误拼接路径,比如把 https://satis.example.com 当成文件而非目录,最终请求变成 https://satis.example.com/packages.json/packages.json,返回 404。
正确写法(全部带尾部斜杠):
- Artifactory:
"url": "https://artifactory.example.com/artifactory/api/composer/my-virtual-repo/" - Satis:
"url": "https://satis.example.com/" - 本地 Nginx:
"url": "https://intranet/pkg/"
这个斜杠在 Composer 2.9.6 中仍是硬性解析规则,截至 2026 年 9 月未有变更。
禁用 packagist.org fallback 是私有包命门
哪怕你在 repositories 里写了正确的私有源 URL,只要没显式关掉默认源,Composer 就永远先查 packagist.org —— 私有包根本不会被匹配,直接报 Could not find package vendor/name。
必须在项目 composer.json 的根层级加这一行:
"packagist.org": false
它不是 config 下的子项,也不是 repositories 里的对象,而是和 require、repositories 同级的布尔键。漏掉、缩进错、拼写成 packagist 或 packagist.com,都会失效。
这个开关不解决网络问题,只解决“找包逻辑”,是私有包能被识别的最低前提。


















