Yii2高级模板部署共享主机后不执行yii serve无法运行如何解决
问题原因
该问题本质是共享主机的Web服务默认根目录未绑定到Yii2高级模板的应用入口目录,且缺失对应的URL重写规则导致。yii serve是Yii封装的PHP内置临时Web服务器命令,仅适用于本地开发,生产环境无需使用。
解决方案
1. 调整站点入口配置
Yii2高级模板默认拆分前端(frontend)、后台(backend)两个独立应用,入口文件分别位于frontend/web/index.php和backend/web/index.php,共享主机默认站点根目录通常为public_html或wwwroot,可选择以下任意一种方案适配:
- 方案1(安全优先,推荐):将整个Yii2项目代码上传到共享主机非Web可访问目录(例如根目录下新建
yii2_project文件夹存放全部代码),再将frontend/web下的所有文件复制到public_html目录作为前端站点入口;若需访问后台,在public_html下新建admin文件夹,将backend/web下的所有文件复制到该目录即可。 - 方案2(无需迁移项目文件):直接在
public_html目录下新建入口文件index.php,修改原有路径指向实际存放Yii2项目的目录,代码示例如下:
<?php defined('YII_DEBUG') or define('YII_DEBUG', false); defined('YII_ENV') or define('YII_ENV', 'prod'); // 下方路径替换为你的Yii2项目实际存放路径 require __DIR__ . '/../yii2_project/vendor/autoload.php'; require __DIR__ . '/../yii2_project/vendor/yiisoft/yii2/Yii.php'; require __DIR__ . '/../yii2_project/common/config/bootstrap.php'; require __DIR__ . '/../yii2_project/frontend/config/bootstrap.php'; $config = yii\helpers\ArrayHelper::merge( require __DIR__ . '/../yii2_project/common/config/main.php', require __DIR__ . '/../yii2_project/common/config/main-local.php', require __DIR__ . '/../yii2_project/frontend/config/main.php', require __DIR__ . '/../yii2_project/frontend/config/main-local.php' ); (new yii\web\Application($config))->run(); ?>
2. 配置URL重写规则
隐藏入口文件index.php,避免路径报错:
- 若共享主机使用Apache服务,在站点根目录(
public_html)新建.htaccess文件,写入以下内容:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php
- 若共享主机使用Nginx服务,在站点配置中添加以下重写规则:
location / { try_files $uri $uri/ /index.php$is_args$args; }
3. 权限与生产配置校验
- 确认项目中
runtime、web/assets目录权限设置为755,若共享主机权限限制严格可临时调整为777 - 生产环境需将入口文件中
YII_DEBUG设为false,YII_ENV设为prod,确认各应用配置中cookieValidationKey已完成配置
完成以上操作后直接访问站点域名即可正常运行,无需执行yii serve命令。
内容的提问来源于stack exchange,提问作者Nour Naji
相关产品推荐
相关产品推荐

