不能只改repo.packagist为内网地址,因Composer需访问/packages.json及/dist/等路径,而Satis默认不生成ZIP包且未启用archive配置、Web服务路径映射错误或权限不足均会导致404或静默回退官方源。

为什么不能只改 repo.packagist 为内网地址
设 composer config --global repo.packagist https://192.168.1.100 看似合理,但 Composer 会仍尝试访问 https://192.168.1.100/packages.json 并校验签名,而这个文件根本不存在——Satis 或其他镜像工具生成的首页是 packages.json,但必须放在 Web 根目录下,且需支持 GET /packages.json 和 GET /p/monolog/monolog/2.13.0.0.zip 这类路径。单纯换 URL 不等于有可用源。
用 Satis 构建静态镜像时必须显式启用 archive
Satis 默认不生成 ZIP 包,只输出元数据;离线场景下没有 ZIP 就等于没货。关键配置必须包含 "archive" 块:
"archive": {
"directory": "dist",
"format": "zip",
"skip-dev": true
}
-
directory决定 ZIP 存哪,最终要让 Web 服务能通过http://192.168.1.100/dist/访问到文件 - 不设
skip-dev: true,Satis 会把require-dev的包也打 ZIP,体积暴增且多数离线环境不需要 - 构建后检查
dist/monolog/monolog/2.13.0.0/monolog-monolog-abc123.zip是否存在,不存在说明 archive 没生效
离线机配置仓库必须用 type: composer + 完整 URL
项目级配置必须写成:
"repositories": [
{
"type": "composer",
"url": "http://192.168.1.100"
}
]
常见错误包括:
- 写成
"type": "artifact":artifact 只读本地文件系统,不走 HTTP,和“共享源”目标冲突 - URL 少了协议或末尾斜杠:
192.168.1.100或http://192.168.1.100/(多斜杠)都会导致 Composer 解析失败 - 没关默认源:
composer config --global repo.packagist false必须执行,否则 Composer 仍会 fallback 到 packagist.org
HTTP 服务权限和路径映射最容易被忽略
Nginx/Apache 必须将请求精准映射到 Satis 输出目录,例如:
- Satis build 输出在
/var/www/satis/web/,其中含packages.json和p/、dist/子目录 - Nginx 配置里
root /var/www/satis/web;,不能是/var/www/satis/,否则/packages.json404 - PHP 进程用户(如
www-data)需对web/有读权限,否则 ZIP 下载返回 403 - 测试是否真通:在离线机
curl -I http://192.168.1.100/packages.json应返回 200,且Content-Type: application/json
路径错一层,整个源就不可用;权限不对,Composer 会静默 fallback 到重试 packagist.org,而不是报错提示。











