Discuz! X(如X3.4/X3.5)可在XAMPP多端口部署,但需严格匹配环境:PHP≤7.3、禁用MySQL 8.0+ caching_sha2_password认证插件、启用openssl/curl/proc_open等扩展,并通过独立域名(如bbs8080.local)隔离Cookie域以防冲突。

Discuz! Q 无法在 XAMPP 下多端口部署 —— 它根本跑不起来,不是端口问题,是环境契约不匹配。Discuz! X(如 X3.4、X3.5)可以,但必须严格控制 PHP 版本(≤7.3)、禁用 MySQL 8.0+ 的默认认证插件、并手动补全 proc_open 等函数权限。
Discuz! X 多端口部署前必须确认的 PHP 版本与扩展
Discuz! X 系列(非 Q)对 PHP 版本极其敏感:XAMPP 8.0+ 自带 PHP 8.0/8.1,会导致安装页空白或报 Fatal error: Uncaught Error: Call to undefined function set_magic_quotes_runtime()。必须回退到 XAMPP 7.4.x 或更早版本(如 xampp-windows-x64-7.4.33-0-VC15-installer.exe)。
同时需手动检查并启用以下扩展和函数:
-
extension=php_openssl.dll(必须开启,否则 HTTPS 检测失败) -
extension=php_curl.dll(附件上传、远程抓取依赖) - 确保
disable_functions =(为空值),且显式包含proc_open、shell_exec(Discuz! X 后台升级/缓存重建会调用) -
allow_url_fopen = On(否则 UCenter 通信失败)
Apache 多端口监听配置的关键细节
仅改 Listen 8080 不够,容易出现 403 或 500 错误。正确做法是:
- 在
C:XAMPPpacheconfhttpd.conf中,Listen行必须独立存在,不能写成Listen: 8080(冒号是错的),应为Listen 8080 - 必须启用
Include conf/extra/httpd-vhosts.conf(去掉行首#) - 每个
<VirtualHost *:8080>块内,DocumentRoot和<Directory>路径必须完全一致,且路径分隔符统一用正斜杠/或双反斜杠\,混用会触发 Apache 启动失败 -
AllowOverride All必须生效,否则 Discuz! X 的伪静态规则(.htaccess)不加载,导致后台 404
MySQL 认证插件不兼容导致数据库连接失败
即使端口通、PHP 正常,Discuz! X 安装时仍可能卡在「连接数据库失败」,错误日志常见:mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]。
这是因为 XAMPP 7.4.33+ 默认启用了 MySQL 8.0+ 的 caching_sha2_password 插件,而 Discuz! X 的 mysqli 扩展不支持。解决方法只有两种:
- 降级 XAMPP 到 7.3.x(含 MySQL 5.7.24,认证插件为
mysql_native_password) - 或保留新版 XAMPP,在 phpMyAdmin 中执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';(密码留空)再刷新权限
注意:该语句必须在 MySQL 命令行或 phpMyAdmin 的 SQL 标签页中执行,不能写进配置文件。
多端口下 Discuz! X 的 URL 重写与 cookie 域名冲突
当你用 http://localhost:8080/bbs 和 http://localhost:8081/bbs 同时跑两个 Discuz! X 实例时,浏览器会把两个站点的 discuz_auth cookie 写在同一域(localhost)下,导致登录态互相覆盖、后台跳转异常。
绕过办法是强制分离域名:
- 修改系统
C:WindowsSystem32driversetchosts,添加两行:127.0.0.1 bbs8080.local127.0.0.1 bbs8081.local - 对应虚拟主机的
ServerName改为bbs8080.local:8080和bbs8081.local:8081 - Discuz! X 后台 → 全局 → 域名设置 → Cookie 域名分别填
.bbs8080.local和.bbs8081.local(注意开头的点)
这个细节几乎没人提,但它是多实例稳定运行的隐性前提 —— 否则你反复登出、Ucenter 同步失败,排查半天才发现是 cookie 污染。


















