根本原因是命令漏-g、键名错为repos.packagist或多一个s、URL末尾缺/,三者任一出错即静默回退packagist.org;验证须执行composer config -g repo.packagist并输出完整JSON如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。

composer config -g repo.packagist 命令为什么没走自定义域名
根本原因不是 DNS 解析失败,而是 Composer 根本没读到你写的配置——命令漏了 -g、键名写成 repos.packagist(多了一个 s)、或 URL 少了末尾斜杠 /,三者任一出错都会静默 fallback 到 packagist.org,且不报错。
验证是否真写进去了:运行 composer config -g repo.packagist,输出必须是完整 JSON,例如:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}如果返回空、null、Key "repo.packagist" does not exist,说明配置失败,立刻重试。
- 必须加
-g:否则只改当前目录下的composer.json,换项目就失效 - 键名只能是
repo.packagist(单数、小写、无 s),packagist.org或repositories.packagist都无效 -
composer是type值,不是注释,不能省略,也不能写成https或其他字符串 - URL 必须 HTTPS 且末尾带
/:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(少斜杠会请求/composerpackages.json导致 404)
项目级配置为何比全局更可靠
你在终端配好了全局镜像,但 GitHub Actions、宝塔后台、Docker 容器里照样卡在 Loading composer repositories——因为它们用的是不同用户的 ~/.composer/config.json,而你的配置只写进了自己的家目录。
项目级配置直接写进 composer.json,随代码提交,CI 和协作者拉下来就能用。执行命令:composer config repo.packagist composer https://mirrors.aliyun.com/composer/(注意:不加 -g)
- 如果
composer.json原本没有repositories字段,命令会新建"repositories": {"packagist": {...}} - 如果已有
"repositories": [](数组格式),命令会报错;需先手动改为"repositories": {}(对象格式)再重试 - 切勿手写
"packagist.org": false—— 这会让 Composer 屏蔽基础包校验,导致php、ext-json等平台依赖无法验证 - 改完后必须删掉
vendor/和composer.lock,再跑composer install(不是update)
自定义域名解析要绕开哪些坑
你以为改了 /etc/hosts 或 DNS 设置就能让 Composer 走本地镜像?不行。Composer 不走系统 DNS 解析,它直连 URL 中的域名,且对重定向极其敏感。
常见错误包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 镜像地址末尾带多余斜杠:
https://my-mirror.internal//触发双重重定向,TLS 握手失败 - 自建镜像用了 HTTP(非 HTTPS):Composer 2.2+ 默认拒绝非 HTTPS 源,静默跳过
- 自建服务返回 302 但 Location 头指向非 HTTPS 地址,Composer 直接放弃
- 镜像服务未同步
packages.json元数据,或缓存未刷新,导致composer install报file could not be downloaded
真正可控的做法是:确保自建镜像服务返回的 packages.json 路径可直访、响应头 Content-Type: application/json 正确、且所有子资源(如 dist ZIP 包链接)也走同一域名并支持 HTTPS。
如何确认自定义域名真的在生效
别信“命令执行成功”,要看实际网络行为。最可靠的验证方式是加日志参数抓请求目标:
运行:composer install -vvv 2>&1 | grep -i 'Downloading\|Fetching'
输出中必须出现你的自定义域名,例如:
Downloading https://my-mirror.internal/packages.json
Fetching https://my-mirror.internal/p2/monolog/monolog.json
- 如果看到
packagist.org或repo.packagist.org,说明配置未生效或被项目级repositories数组里的旧条目覆盖 - 如果看到
curl error 60或SSL certificate problem,说明自建镜像 HTTPS 证书不可信,需用composer config -g secure-http false(仅限内网测试) - 如果日志里反复出现
Retrying,检查镜像服务是否返回了正确的ETag和Last-Modified头,否则 Composer 会强制重刷缓存
复杂点在于:镜像源只影响下载环节,不参与依赖解析。哪怕你把域名配得再准,Resolving dependencies 卡住仍是 PHP 版本约束或 dev 分支依赖的问题,和域名无关。

















