yii2在宝塔运行不报500错误的关键是将站点根目录设为/web子目录(如/www/wwwroot/your-site/web),确保web/index.php可读、php版本≥7.4,并正确配置nginx伪静态规则。

Yii2.0 怎么在宝塔里跑起来不报 500 错误
直接原因通常是 web 目录没设对,或者 index.php 没被正确识别为入口。宝塔默认把站点根目录指向 /www/wwwroot/xxx,但 Yii2 要求 Web 服务器只暴露 web/ 子目录,否则 config/、runtime/ 这些敏感路径可能被直接访问。
实操建议:
- 在宝塔「网站」→「添加站点」时,根目录填
/www/wwwroot/your-site/web(不是项目根目录) - 确认
web/index.php文件存在且可读,PHP 版本选 7.4 或 8.0+(Yii2.0 官方最低要求 PHP 5.6,但实际用 7.2+ 更稳) - 如果用 Nginx,宝塔会自动套用 PHP 站点模板,但需检查伪静态是否启用——Yii2 不强制需要 URL 重写,但开启后
urlManager才能隐藏index.php - 常见错误现象:
500 Internal Server Error且日志里出现require(): Failed opening required '/www/wwwroot/your-site/requirements.php',说明入口文件加载了错误的相对路径,根源还是根目录设高了一级
宝塔里怎么配 Yii2 的 rewrite 规则(Nginx)
不是所有场景都需要重写,但想用干净 URL(比如 /site/login 而非 /index.php?r=site%2Flogin),就得让 Nginx 把请求兜给 index.php 处理。
实操建议:
- 在宝塔站点设置 → 「伪静态」选项卡,选择「Laravel5」模板(它和 Yii2 的重写逻辑一致),或手动粘贴以下规则:
location / {
try_files $uri $uri/ /index.php?$args;
}
注意:别用 Apache 的 .htaccess 内容直接贴过来,Nginx 不认;也别加 if (!-e $request_filename) 这类冗余判断,容易引发 404 或循环重定向。
- 改完记得「重载配置」,否则不生效
- 如果启用了
urlManager['enablePrettyUrl'] = true却仍跳转到index.php,先检查web.php里showScriptName是否设为false
runtime 和 assets 目录权限总被宝塔“重置”怎么办
宝塔后台点「一键部署」或「重启 PHP」时,有时会顺手把整个站点目录 chown 成 www:www,但 Yii2 的 runtime 和 assets 必须可写,而 www 用户不一定有权限写入子目录(尤其当项目是 git clone 下来、属主是 root 时)。
实操建议:
- 进 SSH,执行:
chown -R www:www /www/wwwroot/your-site/runtime和chown -R www:www /www/wwwroot/your-site/web/assets - 别给整个项目目录 777——宝塔的「文件管理器」里右键设权限,仅对这两个目录设 755 或 775 即可
- 如果部署后首次访问报
Failed to write file to disk或Unable to write to directory,基本就是这个原因 - 额外提醒:
runtime目录下logs和cache是运行时生成的,如果权限不对,连错误日志都写不进去,排查会更困难
用宝塔「一键部署」装 Yii2 为什么经常失败
宝塔官方应用市场里的「Yii2」安装包,本质是打包了一个基础骨架(通常是 basic 模板),但它不处理 Composer 依赖、不校验 PHP 扩展(如 mbstring、gd、openssl),也不适配你自己的数据库配置。
实操建议:
- 放弃「一键部署」按钮,改用「手动上传」或「Git 克隆」:把已本地调试好的完整项目(含
vendor)传上去,或在宝塔终端里 cd 到站点目录后运行composer install --no-dev - 务必提前检查 PHP 扩展:在宝塔「软件商店」→「PHP 设置」→「配置文件」里确认
extension=mbstring.so等已取消注释 - 数据库配置别写死在
common/config/main-local.php里再传——用宝塔「网站」→「配置文件」功能,在web/index.php上方加环境变量,或通过$_SERVER注入,避免配置泄露
最麻烦的其实是开发环境和生产环境的差异:本地用 localhost,上线得换 127.0.0.1;本地关了 debug,线上忘了关导致敏感信息暴露。这些细节不会被一键脚本覆盖,得自己盯住。










