局域网镜像连不上HTTPS源,因Composer 2.2+硬性拒绝HTTP;须用Nginx/Caddy配自签名或内网CA证书,PHP需配置openssl.cafile指向该CA根证书,并验证curl -v能成功获取packages.json。

为什么局域网镜像总连不上 HTTPS
局域网自建镜像(如 Satis)默认用 HTTP,但 Composer 2.2+ 会直接拒绝 http:// 协议的源,除非显式加 --allow-http。这不是安全警告,是硬性拦截——命令返回 0,但后续 composer install 仍 fallback 到官方源。
真正安全的做法不是硬开 --allow-http,而是让局域网镜像走 HTTPS:
- 用反向代理(Nginx / Caddy)套一层自签名或内网 CA 签发的证书,URL 写成
https://packagist.internal/ - 在 PHP 的
php.ini中配置openssl.cafile指向你的内网 CA 根证书路径,否则即使 URL 是 HTTPS,也会因证书校验失败而静默失败 - 验证方式:用目标 PHP 执行
curl -v https://packagist.internal/packages.json,确认无SSL certificate problem报错
全局配置 repo.packagist 在局域网里为何失效
局域网环境(尤其是 Docker、CI 或群晖 NAS)下,composer config -g repo.packagist 很可能写进了错误用户的 ~/.composer/config.json。比如:
- CI runner 以
root用户运行,但你本地用admin配置,两者配置文件互不可见 - 群晖 WebStation 绑定的是 PHP 8.2 CLI,但你没用对应路径执行命令:
/volume1/@appstore/PHP82/usr/bin/php /usr/local/bin/composer config -g repo.packagist composer https://packagist.internal/ - Docker 容器内未挂载
~/.composer/config.json,或挂载了但权限为只读
验证是否真生效:进容器或 CI 工作目录后,运行 composer config -g repo.packagist,输出必须是完整 JSON 对象,形如 {"type": "composer", "url": "https://packagist.internal/"};空、null 或报错都说明没落进去。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
项目级 repositories 怎么避免覆盖局域网源
很多人在 composer.json 里写 "repositories": [{"type": "composer", "url": "https://packagist.org"}],以为只是“补充”,实际它会完全屏蔽全局 repo.packagist 配置——Composer 只认第一个非空 repositories 条目,且不合并。
正确做法是:项目级只声明私有包,把公共包交还给全局源:
- 删掉
composer.json里所有对packagist.org或空数组的repositories声明 - 若需引入私有仓库,单独加一项:
{"type": "vcs", "url": "https://gitlab.internal/my-sdk"},不要和 packagist 混在一起 - 确保
composer.json顶层没有"packagist": false或"packagist.org": false这类禁用项
Satis 静态镜像生成后仍拉不到包?检查 archive 和 require-all
Satis 生成的静态镜像,即使 packages.json 能访问,composer install 仍可能报 Could not find package 或卡在 Downloading。根本原因常出在 Satis 配置漏项:
-
"require-all": true缺失 → 只同步composer.json里显式require的包,其他版本、dev 分支、历史 tag 全丢 -
"archive"块缺失或不完整 → 不生成dist/*.zip,composer install就只能走 git clone,而内网通常禁用 git 协议 -
"repositories"里私有仓库没写"type": "vcs"→ Satis 构建时跳过该仓库,对应包压根不会出现在镜像中
最易被忽略的一点:Satis 输出的 packages.json 必须能被浏览器直接打开并返回 200,且内容含完整 packages 字段;如果返回 404、空响应或 JSON 解析错误,Composer 会立即放弃该源,不报具体原因。

















