composer config -g repo.packagist 对私有镜像无效,因其仅替换元数据源(packages.json 获取地址),不修改包的 dist.url 字段,zip 仍从 github 等原始地址下载,局域网无法访问;必须通过 satis 等工具重写 dist.url 指向内网 http 地址,并在项目级 composer.json 中显式禁用 packagist.org。

为什么 composer config -g repo.packagist 对私有镜像无效
它只改元数据入口(packages.json 的获取地址),不碰每个包的 dist.url 字段。哪怕你配了内网镜像 URL,dist.url 仍指向 GitHub、GitLab 等原始源——局域网根本打不开。验证方式很简单:composer show monolog/monolog --verbose,看输出里 dist.url 是不是还以 https://github.com/ 开头。
Nginx 层加 IP 白名单是最轻量可靠的方案
别在 PHP 应用层(比如 Laravel 中间件)做白名单,Composer 请求不带 Cookie、Session,也不走常规路由,中间件根本收不到请求。必须在 Web 服务器或反向代理层拦截。
-
location /必须覆盖所有静态资源路径,包括/packages.json、/p/、/dist/、/zipball/ -
allow和deny all要写在同一个location块里,且deny all必须在最后 - 优先用
alias,不用root;如果镜像根目录是/var/www/mirror,alias /var/www/mirror/;,location /就得匹配全部请求 - 务必关掉
autoindex on,否则白名单形同虚设,攻击者能直接列目录遍历所有 ZIP 包
auth.json 不该是第一道防线
明文落盘、易误提交、CI 环境反复配置 token —— 这些都是运维负担和泄露风险点。IP 白名单是网络层兜底,不依赖客户端行为。只要 Nginx 拦住非白名单请求,客户端连 auth.json 都不用写。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 若私有源启用了双因子(如 GitLab Registry),才需用 Personal Access Token,且 scope 仅限
read_api和read_registry - 全局禁用官方源:在项目
composer.json里写"packagist.org": false,避免 fallback 到境外源 - 不要用
http-basic去保护镜像本身,那是给私有包仓库用的,不是给镜像服务用的
换源后仍卡在 “Loading composer repositories” 怎么快速定位
这不是镜像地址问题,而是 Composer 还在用旧缓存或没命中你配的 URL。排查顺序很关键:
- 先跑
composer diagnose,确认Repo.packagist.org行显示的是你的镜像域名 - 再执行
composer clear-cache清掉本地元数据缓存 - 最后用
composer install -vvv 2>&1 | grep "Downloading"看日志里实际请求的域名是不是内网地址
真正容易被忽略的是:dist.url 字段是否已重写为内网可访问路径。同步工具(如 Satis 或 Private Packagist)必须确保生成的 packages.json 里每个包的 dist.url 都指向你自己的 HTTP 服务,例如 https://pkgs.internal/dist/monolog/monolog/2.10.0/xxx.zip,否则白名单再严也没用。










