迅睿CMS授权版的安装包解压后,会看到一个 public 目录,官方教程也是让你把站点主目录指到它。可如果用的是虚拟主机,面板里根本没有运行目录、主站目录这类选项,这一步就卡住了:指到根目录打不开,指到 public 又不被允许。下面把这种场景的处理过程完整走一遍,从判断主机支不支持,到搬文件、换入口文件,再到改完要补的收尾工作。
一、public 目录到底管什么
先弄清这个目录的定位,后面改起来才不会慌。迅睿CMS 把站点文件分成两拨:
需要对外公开的一拨:入口文件、后台入口、安装程序、伪静态规则等,统一放进 public 目录。
不该被外部直接访问的一拨:框架核心 dayrui、站点配置 config、运行时缓存 cache、上传文件 uploadfile,全部待在 public 的上一层。
站点主目录只指向 public,于是 public 就成了全站唯一的对外入口层,攻击者即便摸到入口文件,也够不到配置和核心代码。官方文档因此一直强调,能设 public 主目录就尽量设。
虚拟主机卡壳的原因也很直接:共享型主机大多把一个固定目录锁成站点根,不允许把根再指向子目录,public 这层隔离就落不了地。
二、先判断主机能不能切到 public 目录
动手改之前先确认一件事,你的主机到底支不支持切换主目录。支持和不支持,走的完全是两条路。
2.1 支持切换的情况
常见面板都留了这个开关,操作入口如下:
宝塔面板:进入「网站」,选中站点后点「设置」,在「网站目录」里把「运行目录」选成 /public。
西部数码这类虚拟主机:在主机管理首页找到「主站目录」一项,点「切换」后在弹窗里确认切到 wwwroot/public。

图 1:主机信息里的「主站目录」和「切换」按钮。来源:迅睿官方文档截图。

图 2:确认把主站目录切到 public 的提示弹窗。来源:迅睿官方文档截图。
2.2 不支持切换的情况
面板里找不到运行目录、主站目录这类选项,或者点了之后只允许固定用根目录,就属于不支持。典型表现有三种:
站点主目录被锁死为 wwwroot 或 htdocs,改不动。
面板里只有一个网站根目录,没有可选的子目录入口。
装完访问域名,要么直接列出目录文件,要么报错,怎么调都不对。
遇到这种情况,就别再跟面板较劲了,直接走下一节的改造。
三、不支持 public 时的标准改造

图 3:改造的整体流程,前三步解决打不开的问题,后两步负责收尾。示意图。
核心思路一句话:public 这层外壳不要了,把壳里的文件直接摆到网站根目录,让入口文件和 dayrui、config 变成同级。具体三步:
复制:把 public 目录里的所有文件(入口文件、后台入口、install.php、.htaccess、favicon.ico 等)全部复制到网站根目录。
删除:复制完确认无误后,把 public 目录整个删掉,避免残留文件被外部直接访问。
替换:用官方给出的内容替换根目录下的 index.php,让路径基准指向当前目录。
复制、删除、替换这三步的顺序别颠倒,先复制再删除,中间出错还能退回原样。

图 4:改造前后目录层级的对比,public 目录被删除。示意图,依据官方文档绘制。
改完之后,根目录里 index.php 与 dayrui、config、cache、uploadfile 平级排列,public 目录消失,站点主目录就是网站根目录本身。
官方给出的 index.php 全文如下,直接覆盖粘贴即可:
<?php
/**
* 入口程序
* 开发者可在这里定义系统目录变量
*/
declare(strict_types=1);
header('Content-Type: text/html; charset=utf-8');
//header('X-Frame-Options: SAMEORIGIN'); // 防止被站外加入iframe中浏览
// 是否是开发者模式(1开启、0关闭),上线之后建议关闭此开关
define('IS_DEV', 1);
// 是否允许后台修改模板文件(1开启、0关闭),请不要长期开启此功能
define('IS_EDIT_TPL', 0);
// 主网站目录,表示index.php文件的目录
define('ROOTPATH', dirname(__FILE__).'/');
// 当前站点目录
!defined('WEBPATH') && define('WEBPATH', dirname(__FILE__).'/');
// 缓存文件存储目录,支持自定义路径
define('WRITEPATH', ROOTPATH.'cache/');
// 系统核心程序目录,支持自定义路径和改名
define('FCPATH', dirname(__FILE__).'/dayrui/');
// 入口文件名称
!defined('SELF') && define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
// 后台管理标识
!defined('IS_ADMIN') && define('IS_ADMIN', FALSE);
// ======开始,自动进入安装界面监测代码
if (!is_file(WRITEPATH.'install.lock') && !isset($_GET['c'])) {
require WEBPATH.'install.php';
exit;
}
// 判断环境
if (version_compare(PHP_VERSION, '7.2.0') < 0) {
echo "PHP版本必须在7.3以上,当前".PHP_VERSION."";exit;
}
//=======结束,安装之后可以删除此段代码
// 执行主程序
require FCPATH.'Fcms/Init.php';这里再划一次重点:入口文件必须和 dayrui 目录待在同一层,否则程序找不到框架核心,页面只会空白或者直接报错。
四、入口文件为什么必须换
会有人问,文件都搬到根目录了,为什么不能沿用原来的 index.php?答案是路径基准变了。
入口文件本来待在 public 子目录里,它要找框架目录就得先向上退一层;现在它自己搬到了根目录,再按原来的相对位置去找,指向的就是一个并不存在的地方。所以官方给了一份以文件自身所在目录为基准的入口文件,用 dirname(FILE) 定位,文件放在哪里都能算对。

图 5:入口文件中 ROOTPATH、WEBPATH、FCPATH 的定义。示意图,代码取自官方文档。
这份入口文件里,真正决定去哪儿找东西的是三个常量:
ROOTPATH:主网站目录,也就是 index.php 所在目录,缓存等运行时文件挂在它下面。
WEBPATH:当前站点目录,安装检测与入口加载都基于它。
FCPATH:框架核心目录,指向同一层里的 dayrui,整站程序就是从这里拉起来的。
三个常量全部以 dirname(FILE) 打底,所以 只要入口文件和 dayrui 同级,路径就自动对上。这也解释了为什么改造时必须连入口文件一起换掉。
五、改造后还要补的四件事
文件搬完、入口换好,不代表就能上线。下面四件事漏掉任何一件,站都可能跑不顺。
伪静态规则。Apache 环境下,跟着搬过来的 .htaccess 还在站点根目录,规则照旧生效;nginx 不认 .htaccess,必须在站点配置里单独写伪静态规则,否则内页和内容页一律 404。
目录写权限。cache 和 uploadfile 两个目录要放开写权限,否则后台会白屏,或者提示写入失败。
后台入口改名。后台入口文件原本也在 public 里,一起搬到根目录后,最好换成不容易被猜到的名字,减少被扫描器撞库的机会。
删掉安装检测代码。官方入口文件里有一段没装就跳转安装界面的代码,装完之后按注释删掉这一段,少留一个入口。
六、这样改安全吗
必须实话实说:官方文档明确提醒过,把 public 里的文件平铺到根目录,安全性不如专门的 public 主目录方案。
原因不难理解,改造后核心目录直接暴露在站点根下。dayrui、config、cache 这些原本躲在 public 上一层、浏览器够不到的目录,如今和入口文件并排站在根目录里,万一服务器配置不当或某条规则漏写,就存在被直接请求到的可能。
所以用这种方式部署,至少补上这几条:
Apache 环境确认站点根的 .htaccess 正常生效,它本身就带了一批拒绝访问的规则。
nginx 环境在站点配置里补 location 规则,把 dayrui、config、cache、template 几个目录挡在外部。
生产环境把入口文件里的 IS_DEV 改成 0,IS_EDIT_TPL 保持 0,减少调试信息泄露。

图 6:nginx 下拦截核心目录直接访问的参考写法。示意图,可按站点情况调整。
常见问题
Q1:改完之后后台进不去怎么办?
A:先确认 index.php 已经换成官方给出的版本、并且与 dayrui 同级;再检查 cache 和 uploadfile 是否有写权限,后台白屏多半是这两个原因。
Q2:能不能不删 public 目录,只把文件复制出来?
A:不建议。public 残留会让同一套程序出现两个入口,安装文件和后台文件可能被直接访问到,等于把隔离的意义又抹掉了。
Q3:改造之后还需要重新安装吗?
A:不需要。只要数据库和 config 没动过,入口文件路径对了,原有站点数据照常可用。
Q4:nginx 和 Apache 都要配伪静态吗?
A:看服务器类型。Apache 认 .htaccess,文件搬到根目录就生效;nginx 不认 .htaccess,必须在站点配置里单独写规则。
写在最后
虚拟主机不支持 public 主目录,本质上不是装不上,而是入口文件的位置变了、路径基准跟着变。把 public 里的文件搬到站点根、删掉 public、换成官方那份以 dirname(FILE) 定位的入口文件,站就能正常起来;再把伪静态、目录权限和后台入口收尾,安全性也能补回大半。动手前建议先做一次完整备份,改错了随时都能退回。
参考来源:
迅睿官方文档:设置网站主目录 public
迅睿CMS 官方网站
宝塔面板官方网站
更新时间:2026-10-14 | 作者:白马号