必须将web服务器根目录设为web子目录,因yii2要求仅暴露web/下的index.php与静态资源,防止config/、runtime/等敏感目录被直接访问,否则必报500错误或路径异常。

想在本地快速跑起一个Yii项目却卡在环境配置、目录结构或500错误上?不是PHP版本不对,就是web目录设错、runtime不可写、伪静态没配对——这些问题在一键PHP环境里高频出现,但其实每一步都有明确解法。
确认基础环境是否达标
打开命令行,依次执行以下两条命令:
php -v → 确保输出版本号≥7.4(【Yii 2.0.46+ 强制要求 PHP 7.4】)
php -m | findstr "pdo_mysql mbstring intl openssl gd" → Windows下用该命令,Linux/macOS把findstr换成grep;若任一模块缺失,需进入php.ini取消对应扩展前的分号注释并重启Apache/Nginx服务。
这一步跳过会直接导致后续composer安装失败或运行时报Class not found。
用Composer创建项目(唯一可靠方式)
方法一:基础模板(适合学习、API、小型后台)
cd 进入你的一键环境网站根目录(如phpStudy的www、XAMPP的htdocs),执行:
composer create-project yiisoft/yii2-app-basic myapp
注意:不要加--prefer-dist参数——它可能拉取损坏的压缩包缓存,首次构建必须让Composer完整clone git历史以保一致性。
方法二:高级模板(含frontend/backend/admin三端分离)
composer create-project yiisoft/yii2-app-advanced myapp
创建完成后,立刻进入myapp目录,运行php init → 按提示选0(Development Environment),生成environments下的配置文件。
关键目录权限与入口设置
第一步:确保runtime和web/assets可写
Windows用户右键点击myapp\runtime和myapp\web\assets → 属性 → 安全 → 编辑 → 给Users组“完全控制”权限;
Linux/macOS执行:
chmod 777 runtime web/assets
第二步:设置Web服务器根目录为web子目录
phpStudy:站点管理 → 修改站点根目录为D:\phpStudy\WWW\myapp\web
XAMPP:Apache配置中DocumentRoot指向xampp\htdocs\myapp\web
宝塔面板:添加站点时,根目录直接填/www/wwwroot/myapp/web(【不是项目根目录,否则config/、runtime/将暴露】)
第三步:验证入口文件是否存在且可读
检查myapp\web\index.php是否真实存在,文件权限不为只读;若被编辑器意外保存为UTF-8 BOM格式,会导致空白页或500错误,建议用Notepad++另存为“UTF-8 无BOM”格式。
配置伪静态(启用美化URL)
仅当web.php中设置了'urlManager' => ['enablePrettyUrl' => true]时才需要此步。
Apache环境:确认已开启mod_rewrite模块,在myapp\web\.htaccess中已有标准规则,无需额外操作。
Nginx环境(含宝塔):
① 进入站点设置 → 伪静态 → 选择「Laravel5」模板(逻辑与Yii一致)
② 或手动粘贴以下规则(务必删除原有.htaccess内容,Nginx不识别):
location / {
try_files $uri $uri/ /index.php?$args;
}
③ 点击「重载配置」生效,否则rewrite不触发。
访问测试与常见错误定位
浏览器访问http://localhost/myapp/web/(未配虚拟主机时)或http://yii2.test(已配hosts+虚拟域名)
看到绿色对勾页面即成功;若报500错误且日志提示“Failed opening required '.../requirements.php'”,说明Web服务器根目录仍指向项目根目录而非web子目录,立即回退到上一节修正。
若显示“You don’t have permission to access this resource.”,检查Apache是否启用FollowSymLinks选项,或Nginx是否遗漏root指令指向正确路径。
访问/index.php?r=site/about能打开但美化URL(如/site/about)404,说明伪静态未生效或urlManager中showScriptName未设为false。











