Winter CMS 多实例需用端口隔离+虚拟主机:启用httpd-vhosts.conf、为各端口配独立VirtualHost指向public目录、保持RewriteBase/、PHP扩展启用、数据库及权限独立配置。

Winter CMS 是基于 Laravel 的轻量级 CMS,部署在 XAMPP 上时,若需多端口运行多个实例(比如开发、测试、预发环境隔离),不能只靠改 htdocs 子目录——它依赖 Laravel 的路由和 PHP 环境配置,对 Apache 的虚拟主机与端口监听有明确要求。直接放多个 Winter CMS 到不同子目录下、用 localhost:8080/winter1 这种路径访问,大概率会触发 404 或路由错乱,因为其 public/index.php 是入口,且重写规则(.htaccess)默认只适配根路径。
必须开启 httpd-vhosts.conf 并启用 NameVirtualHost
XAMPP 默认不启用虚拟主机配置,即使你改了httpd.conf 中的 Include conf/extra/httpd-vhosts.conf,也得确认两件事:
- httpd-vhosts.conf 文件里没有被注释掉的 NameVirtualHost *:80(新版 Apache 2.4+ 已废弃该指令,但 XAMPP 7.x 及以下仍依赖它)
- 若你新增了 Listen 8080,对应也要加 NameVirtualHost *:8080,否则 Apache 不会把该端口的请求交由 <virtualhost></virtualhost> 处理
常见错误现象:浏览器访问 <a href="https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e">https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e</a> 直接跳转到 XAMPP 默认页,或返回 403 Forbidden
解决办法是检查 httpd-vhosts.conf 开头是否包含:
NameVirtualHost *:80 NameVirtualHost *:8080 NameVirtualHost *:8081然后每个端口配一个独立
<virtualhost></virtualhost> 块,且 DocumentRoot 必须指向对应 Winter CMS 的 public/ 目录,不是项目根目录。
每个 Winter CMS 实例必须独立 DocumentRoot + RewriteBase
Winter CMS 的.htaccess 文件在 public/ 下,默认 RewriteBase /。如果强行用子路径(如 localhost:8080/winter-test)而不改这个值,所有静态资源和路由都会 404。
正确做法是:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 每个实例单独建文件夹,例如:
D:/xampp/htdocs/winter-dev、D:/xampp/htdocs/winter-staging - 在
httpd-vhosts.conf中为每个端口指定完整路径:<VirtualHost *:8080> DocumentRoot "D:/xampp/htdocs/winter-dev/public" ServerName localhost <Directory "D:/xampp/htdocs/winter-dev/public"> AllowOverride All Require all granted </Directory> </VirtualHost> - 确保每个
public/.htaccess里的RewriteBase保持为/(因为它是根访问)
若你坚持用子路径而非端口隔离,就必须手动修改每个 .htaccess 的 RewriteBase /winter-dev/,并同步调整 config/app.php 中的 'url' 和 public/index.php 的 require <strong>DIR</strong>.'/../bootstrap/autoload.php'; 路径——这极易出错,不推荐。
PHP 扩展与权限问题常被忽略
Winter CMS 依赖mbstring、openssl、gd、curl 和 xml 扩展,XAMPP 自带的 PHP 通常已启用,但:
- 若你升级过 XAMPP 或手动替换了 PHP 版本,需检查 php.ini 中这些扩展是否取消了分号注释
- Windows 下若 public/ 目录权限被继承限制(尤其从 ZIP 解压后),Apache 可能无法读取 .env 或写入 storage/,表现是安装页卡住、后台无法上传图片、报错 file_put_contents(): failed to open stream: Permission denied
- 解决方法:右键 public 和 storage 文件夹 → 属性 → 安全 → 编辑 → 添加 Everyone 或 IIS_IUSRS(取决于 Apache 运行用户),赋予“修改”权限
数据库配置必须按实例隔离
Winter CMS 的.env 文件中,DB_DATABASE、DB_USERNAME、DB_PASSWORD 必须为每个实例单独设置,不能共用同一个库名:
- 推荐方式:用 phpMyAdmin 为每个 Winter CMS 创建独立数据库(如 winter_dev、winter_staging)
- .env 中不要留空密码字段,哪怕本地开发也显式写 DB_PASSWORD=(XAMPP 默认 root 密码为空,但 Laravel 会把空字符串当 null 处理,导致连接失败)
- 若改过 MySQL 端口(如 3307),还需在 .env 中加 DB_PORT=3307Windows 下最容易被忽略的一点:XAMPP 控制面板启动 Apache 后,它默认以服务方式运行,而服务账户(Local System)对某些用户目录(如 C:\Users\XXX\ 下的项目)无读取权限。所以 Winter CMS 最好放在 D:/xampp/htdocs/ 下,而不是桌面或文档路径。

















