yii restful接口生产环境运行核心三点:入口路径必须指向web/目录、urlmanager规则需配对、runtime和assets目录须可写。

Yii RESTful 接口在生产环境能跑起来,核心就三点:入口路径必须指向 web/ 目录、urlManager 规则得配对、runtime 和 assets 目录得可写。其他全是围绕这三点展开的细节问题。
Web 服务器 root 必须指向 web/ 目录
很多人把整个 Yii 项目根目录(含 config/、controllers/)直接设为 Web 根,这是严重安全隐患——配置文件、模型代码可能被直接下载。
- Nginx 配置中
root必须是/var/www/html/myapi/web,不是/var/www/html/myapi - Apache 要确保
.htaccess文件存在且生效,DocumentRoot同样指向web/子目录 - 如果用 PHP 内置服务器测试(仅限开发),命令必须带
-t web:php -S localhost:8000 -t web - 访问
http://yourdomain.com/index.php能打开,但http://yourdomain.com/config/web.php返回 404,才算路径正确
urlManager 中的 UrlRule 必须显式启用 REST 支持
yii\rest\UrlRule 不是自动激活的,哪怕你继承了 yii\rest\ActiveController,没配规则照样 404。
- 确认
config/web.php的urlManager组件里启用了enablePrettyUrl => true和enableStrictParsing => true - 规则数组里不能只写
'product'这种字符串,必须用完整类名:['class' => 'yii\rest\UrlRule', 'controller' => 'v1/product'] - 如果模块叫
v1,控制器在modules/v1/controllers/ProductController.php,那controller值就是'v1/product',不是'product'或'v1/ProductController' - 调试时临时加一条
'*' => 'site/error'规则,能快速判断是路由未命中还是逻辑报错
runtime/ 和 assets/ 目录权限不正确会导致静默失败
Yii 在运行时会往 runtime/ 写日志、缓存、锁文件;往 assets/ 发布前端资源。权限不对不会报明确错误,而是返回空白页或 500。
- 执行
chmod -R 775 runtime/ assets/是最常用解法,但注意:775 要求 Web 进程用户(如www-data)和部署用户同组 - 更稳妥的是用
chown -R www-data:www-data runtime/ assets/(Nginx/Apache 用户名依实际调整) - 如果用 Docker,要在
Dockerfile里显式RUN chown -R www-data:www-data /app/runtime /app/assets - 检查
runtime/logs/app.log是否有内容,空日志基本可断定是runtime/不可写
API 版本路由前缀(如 /v1/)必须和模块定义完全一致
版本控制不是靠 URL 拼接实现的,而是模块系统 + URL 规则共同作用的结果,错一个字母就 404。
- 模块类文件路径要是
modules/v1/Module.php,类名必须是api\modules\v1\Module(命名空间要匹配目录结构) -
config/main.php中modules配置项里,键名'v1'必须和UrlRule的controller前缀一致 - 访问
/v1/products时,Yii 会尝试加载modules/v1/controllers/ProductsController.php—— 注意复数形式、大小写,PHP 类名区分大小写 - 如果用 Gii 生成模块,别改
Module.php里的$controllerNamespace,否则控制器找不到
真正卡住人的往往不是框架本身,而是 Web 服务器路径、文件权限、模块命名空间这三处的微小错位。建议先关掉所有美化规则,用 index.php?v1/product 这种原始路径验证控制器是否能跑通,再一层层打开 rewrite、版本前缀、行为过滤器。











