Composer离线配置与Web服务器无关,真正生效需同时满足:设置COMPOSER_DISABLE_NETWORK=1环境变量、运行composer config --global repo.packagist false禁用全局仓库、执行composer install时必须加--no-plugins参数。

不需要配置虚拟主机,也不需要本地映射。 Composer 离线配置和 Web 服务器(如 Apache/Nginx)或域名解析完全无关。所谓“本地映射”,比如 hosts 文件改写、vhost 配置、反向代理等,对 Composer 的离线行为毫无影响——它根本不会发起 HTTP 请求,也就不存在“映射到哪”的问题。
为什么有人误以为要配虚拟主机?
混淆通常来自两类场景:
- 把
composer install失败和 Web 访问失败混为一谈:vendor/ 写入失败是权限或路径问题,不是 DNS 或路由问题 - 看到错误里有
packagist.org就去改/etc/hosts,但这是治标不治本——真正该做的是关掉网络开关,而不是伪造响应 - 在虚拟主机环境里执行 Composer 时失败,误归因为“没配 vhost”,实际是项目放错了目录(如放在
~/public_html/下导致 PHP 无法写 vendor/)
离线模式下真正要检查的三件事
Composer 是否真离线,只取决于三个硬性条件是否全部满足:
-
COMPOSER_DISABLE_NETWORK=1环境变量已设置(Linux/macOS 用export,Windows PowerShell 用$env:COMPOSER_DISABLE_NETWORK="1") - 全局仓库已禁用:
composer config --global repo.packagist false(必须运行,不能只删 config 文件) - 没有启用任何会隐式联网的插件:
--no-plugins是强制项,不是可选项;phpstan/extension-installer这类插件即使没显式 require,也可能在 install 阶段触发网络调用
虚拟主机环境里 Composer 装不上,其实是路径权限问题
如果你在虚拟主机上跑 composer install 报 Permission denied,99% 是因为:
- 项目根目录落在
~/public_html/myapp/这类 Web 可访问路径下,而主机禁止 PHP 在该目录写文件 - 正确做法是把项目移到用户主目录下的可写子目录,例如
~/myapp/,再执行:cd ~/myapp && composer install --no-dev --optimize-autoloader --no-interaction - 装完后,用符号链接或 Web 服务器 alias 把
~/myapp/public/暴露为 Web 根目录,而不是把整个项目放进去
离线配置最易被忽略的一点:所有操作必须在 COMPOSER_DISABLE_NETWORK=1 生效的前提下验证。哪怕你改了 /etc/hosts,只要这个变量没设,Composer 仍会尝试建立 TLS 连接,然后卡在证书校验或 DNS 解析阶段——它不会告诉你“我连不上”,只会报 Curl error 60 或 Could not resolve host,让人误以为是网络层问题。











