Yii框架入口文件迁移需同步调整三处:加载路径、配置合并逻辑(必须用ArrayHelper::merge并按common→frontend/backend顺序)、assetManager的basePath和baseUrl;环境变量应通过.env文件管理,后台入口须避免使用admin.php等常见名。

Yii框架的引导文件(即入口文件)不能“随便改”,而是必须同步调整加载路径、配置合并逻辑和资源定位,否则会直接报错或静态资源 404。
入口文件从 web/index.php 移到项目根目录
这是最常见需求:想用 http://example.com/ 访问前台,而不是 http://example.com/frontend/web/。操作不是简单复制粘贴,关键在三处:
-
require路径全部改成相对于新位置的写法,比如原__DIR__.'/../vendor/autoload.php'在根目录下要改成__DIR__.'/vendor/autoload.php' -
$config合并顺序不能错,必须先common,再frontend或backend,漏掉main-local.php会导致数据库连不上 - 必须显式调用
yii\helpers\ArrayHelper::merge(),不能只 require 一个配置文件
示例片段(根目录 index.php):
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/common/config/main.php'),
require(__DIR__ . '/common/config/main-local.php'),
require(__DIR__ . '/frontend/config/main.php'),
require(__DIR__ . '/frontend/config/main-local.php')
);
(new yii\web\Application($config))->run();
assetManager 的 basePath 和 baseUrl 必须重设
移入口文件后,AssetBundle 默认仍按原 web/ 目录生成链接,结果所有 CSS/JS 都 404。必须在对应模块的 main.php 中显式覆盖:
- 前台(
frontend/config/main.php)加:'assetManager' => ['basePath' => '@webroot/frontend/web/assets', 'baseUrl' => '@web/frontend/web/assets'] - 后台(
backend/config/main.php)加:'assetManager' => ['basePath' => '@webroot/backend/web/assets', 'baseUrl' => '@web/backend/web/assets'] - 注意:
@webroot指的是 Web 可访问的物理根目录(如 Apache 的 DocumentRoot),不是项目根目录
环境变量和调试开关别硬编码在入口里
把 YII_DEBUG 和 YII_ENV 写死在 index.php 里,上线就得手动改,极易出错。推荐用 .env 文件驱动:
- 项目根目录放
.env,内容如:APP_ENV=prod\nAPP_DEBUG=false - 入口文件开头加:
$envConfig = parse_ini_file(__DIR__.'/.env'); defined('YII_DEBUG') or define('YII_DEBUG', filter_var($envConfig['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN)); defined('YII_ENV') or define('YII_ENV', $envConfig['APP_ENV']); -
.env必须加进.gitignore,避免敏感配置泄露
后台入口命名不能只叫 admin.php
虽然文档常以 admin.php 举例,但生产环境这么做等于裸奔:
- Apache/Nginx 默认允许执行
.php,攻击者可直接探测/admin.php、/manage.php等常见名 - 建议用无规律名称,如
z9kX2L.php,并配合 Nginx location 规则限制 IP 或 referrer - 更稳妥的做法是:后台不单独暴露入口,统一走前台路由 + RBAC 控制,或用反向代理隐藏真实路径
真正麻烦的从来不是改哪几行代码,而是改完之后资产路径失效、环境变量没生效、后台入口被扫出——这些点不逐个验证,上线就等着收告警。


















