迅睿CMS授权版虚拟主机不支持public目录安装教程

迅睿CMS授权版的安装包解压后,会看到一个 public 目录,官方教程也是让你把站点主目录指到它。可如果用的是虚拟主机,面板里根本没有运行目录、主站目录这类选项,这一步就卡住了:指到根目录打不开,指到 public 又不被允许。下面把这种场景的处理过程完整走一遍,从判断主机支不支持,到搬文件、换入口文件,再到改完要补的收尾工作。

一、public 目录到底管什么

先弄清这个目录的定位,后面改起来才不会慌。迅睿CMS 把站点文件分成两拨:

  1. 需要对外公开的一拨:入口文件、后台入口、安装程序、伪静态规则等,统一放进 public 目录。

  2. 不该被外部直接访问的一拨:框架核心 dayrui、站点配置 config、运行时缓存 cache、上传文件 uploadfile,全部待在 public 的上一层。

站点主目录只指向 public,于是 public 就成了全站唯一的对外入口层,攻击者即便摸到入口文件,也够不到配置和核心代码。官方文档因此一直强调,能设 public 主目录就尽量设。

虚拟主机卡壳的原因也很直接:共享型主机大多把一个固定目录锁成站点根,不允许把根再指向子目录,public 这层隔离就落不了地。

二、先判断主机能不能切到 public 目录

动手改之前先确认一件事,你的主机到底支不支持切换主目录。支持和不支持,走的完全是两条路。

2.1 支持切换的情况

常见面板都留了这个开关,操作入口如下:

  1. 宝塔面板:进入「网站」,选中站点后点「设置」,在「网站目录」里把「运行目录」选成 /public。

  2. 西部数码这类虚拟主机:在主机管理首页找到「主站目录」一项,点「切换」后在弹窗里确认切到 wwwroot/public。

迅睿CMS虚拟主机面板里的主站目录与切换按钮

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

虚拟主机把主站目录切换到public的确认弹窗

图 2:确认把主站目录切到 public 的提示弹窗。来源:迅睿官方文档截图。

2.2 不支持切换的情况

面板里找不到运行目录、主站目录这类选项,或者点了之后只允许固定用根目录,就属于不支持。典型表现有三种:

  1. 站点主目录被锁死为 wwwroot 或 htdocs,改不动。

  2. 面板里只有一个网站根目录,没有可选的子目录入口。

  3. 装完访问域名,要么直接列出目录文件,要么报错,怎么调都不对。

遇到这种情况,就别再跟面板较劲了,直接走下一节的改造。

三、不支持 public 时的标准改造

迅睿CMS授权版 public 目录改造的五步流程

图 3:改造的整体流程,前三步解决打不开的问题,后两步负责收尾。示意图。

核心思路一句话:public 这层外壳不要了,把壳里的文件直接摆到网站根目录,让入口文件和 dayrui、config 变成同级。具体三步:

  1. 复制:把 public 目录里的所有文件(入口文件、后台入口、install.php、.htaccess、favicon.ico 等)全部复制到网站根目录。

  2. 删除:复制完确认无误后,把 public 目录整个删掉,避免残留文件被外部直接访问。

  3. 替换:用官方给出的内容替换根目录下的 index.php,让路径基准指向当前目录。

复制、删除、替换这三步的顺序别颠倒,先复制再删除,中间出错还能退回原样。

迅睿CMS授权版public目录改造前后的文件位置对比

图 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) 定位,文件放在哪里都能算对。

迅睿CMS入口文件index.php里三个目录常量的定义

图 5:入口文件中 ROOTPATH、WEBPATH、FCPATH 的定义。示意图,代码取自官方文档。

这份入口文件里,真正决定去哪儿找东西的是三个常量:

  1. ROOTPATH:主网站目录,也就是 index.php 所在目录,缓存等运行时文件挂在它下面。

  2. WEBPATH:当前站点目录,安装检测与入口加载都基于它。

  3. FCPATH:框架核心目录,指向同一层里的 dayrui,整站程序就是从这里拉起来的。

三个常量全部以 dirname(FILE) 打底,所以 只要入口文件和 dayrui 同级,路径就自动对上。这也解释了为什么改造时必须连入口文件一起换掉。

五、改造后还要补的四件事

文件搬完、入口换好,不代表就能上线。下面四件事漏掉任何一件,站都可能跑不顺。

  1. 伪静态规则。Apache 环境下,跟着搬过来的 .htaccess 还在站点根目录,规则照旧生效;nginx 不认 .htaccess,必须在站点配置里单独写伪静态规则,否则内页和内容页一律 404。

  2. 目录写权限。cache 和 uploadfile 两个目录要放开写权限,否则后台会白屏,或者提示写入失败。

  3. 后台入口改名。后台入口文件原本也在 public 里,一起搬到根目录后,最好换成不容易被猜到的名字,减少被扫描器撞库的机会。

  4. 删掉安装检测代码。官方入口文件里有一段没装就跳转安装界面的代码,装完之后按注释删掉这一段,少留一个入口。

六、这样改安全吗

必须实话实说:官方文档明确提醒过,把 public 里的文件平铺到根目录,安全性不如专门的 public 主目录方案。

原因不难理解,改造后核心目录直接暴露在站点根下。dayrui、config、cache 这些原本躲在 public 上一层、浏览器够不到的目录,如今和入口文件并排站在根目录里,万一服务器配置不当或某条规则漏写,就存在被直接请求到的可能。

所以用这种方式部署,至少补上这几条:

  1. Apache 环境确认站点根的 .htaccess 正常生效,它本身就带了一批拒绝访问的规则。

  2. nginx 环境在站点配置里补 location 规则,把 dayrui、config、cache、template 几个目录挡在外部。

  3. 生产环境把入口文件里的 IS_DEV 改成 0,IS_EDIT_TPL 保持 0,减少调试信息泄露。

迅睿CMS用nginx规则屏蔽dayrui等核心目录的示意

图 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 | 作者:白马号