将system目录移出web根目录是为了防止框架核心代码被直接访问导致信息泄露,因nginx不支持.htaccess且共享主机可能禁用allowoverride,物理隔离最稳妥。

为什么要把 system 目录移出 web 根目录
因为 system 目录里全是框架核心代码(比如 core/、libraries/、helpers/),一旦被 Web 服务器直接暴露,攻击者可能通过构造 URL 访问到未授权的 PHP 文件(例如 /system/core/CodeIgniter.php),触发解析错误或信息泄露。虽然默认 .htaccess 会拦截,但 Nginx 不认它,共享主机也可能禁用 AllowOverride,所以物理隔离才是最稳妥的防御方式。
移动 system 目录的三步实操
假设你当前项目结构是:
/var/www/html/ ├── index.php ├── system/ ├── application/ └── .htaccess
目标是把 system 移到 /var/www/(即 web 根目录 /var/www/html/ 的上一级):
- 执行
mv /var/www/html/system /var/www/system - 编辑根目录下的
index.php,找到这两行:
$system_path = 'system'; $application_folder = 'application';
改成:
$system_path = '/var/www/system'; $application_folder = 'application';
- 确认
/var/www/system对 Web 进程用户(如www-data或apache)可读:运行ls -ld /var/www/system,确保权限不是700且属主包含 Web 用户;必要时执行chown -R www-data:www-data /var/www/system
常见报错和对应解法
移完立刻 500?大概率是以下三个问题之一:
-
Warning: require_once(/var/www/system/core/CodeIgniter.php): failed to open stream→ 检查$system_path是否写成相对路径(如../system),CI3.1.5 不支持相对路径,必须用绝对路径 -
PHP Fatal error: Class 'CI_Controller' not found→system目录权限不对,Web 进程无法递归读取子文件,别只改顶层目录权限,要chmod -R 755 /var/www/system(或更保守的750) - 页面空白无报错 → 开启 PHP 错误显示:
ini_set('display_errors', 1); error_reporting(E_ALL);加到index.php开头,否则 CI3 默认静默失败
顺手把 application 也移出去更彻底
如果连 application 也要移(比如配置文件含数据库密码),操作一样:移到 /var/www/application,然后在 index.php 改 $application_folder = '/var/www/application';。注意此时 application/config/config.php 中的 $config['base_url'] 仍需保持对外可访问的 URL(如 http://example.com/),它和物理路径无关。另外,writable/ 目录(用于日志、缓存、session)必须保留在 web 可写路径下,不能移走——否则 mkdir(): Invalid path 会高频出现。











