@app是应用根目录物理路径,@webroot是web入口目录物理路径;前者存放配置、控制器等服务端文件,后者仅存放css、js等可公开访问的前端资源,二者用途不同且存在严格安全边界。

@app 是应用根目录,@webroot 是 Web 入口目录
两者都是物理路径别名,但指向完全不同的位置:@app 指向整个 Yii 应用的根目录(比如 E:/WWW/basic),而 @webroot 指向 index.php 所在的 Web 可访问目录(通常是 @app/web,即 E:/WWW/basic/web)。它们不是父子关系的“子集”,而是用途截然不同的两个基础路径。
@app 下的文件默认不可被 Web 直接访问
这是关键安全边界。例如 @app/config/db.php 存放数据库密码,它必须远离 Web 根目录;而 @webroot/assets/ 或 @webroot/images/logo.png 必须能通过 URL(如 /basic/web/images/logo.png)被浏览器加载。若把敏感配置误放 @webroot 下,可能直接暴露源码。
-
@app用于服务端逻辑:配置、控制器、模型、运行时日志(@app/runtime)等 -
@webroot仅用于前端资源:CSS、JS、图片、index.php入口文件本身 - URL 路由不会映射到
@app下任何路径,除非你手动配置了不安全的 Web 服务器规则
@webroot 不等于 @app/web,但通常就是它
表面上看 @webroot 常被设为 @app/web,但它是独立别名,可被重定义。比如部署时用符号链接把 /var/www/html 指向 /opt/myapp/public,那就要在 bootstrap.php 中显式设置:Yii::setAlias('@webroot', '/opt/myapp/public');。此时 @app/web 仍是原路径,但 Web 服务器实际服务的是新路径 —— 这种解耦对容器化或 PaaS 部署很关键。
- 修改
@webroot不影响@app,反之亦然 -
@web(URL 别名)必须与@webroot的物理位置匹配,否则AssetManager生成的链接会 404 - 检查当前值:
var_dump(Yii::getAlias('@app'));和var_dump(Yii::getAlias('@webroot'));
常见混淆点:@web 和 @webroot 容易写反
开发中常把 @web(URL)当路径用,或把 @webroot(路径)拼进 URL,导致资源加载失败或路径遍历漏洞。比如:
- 错误:
<img src="<?=%20@webroot%20?>/images/logo.png">→ PHP 解析报错,且@webroot是路径,不能当字符串拼接 - 错误:
file_put_contents('@webroot/cache/data.txt', $content);→ 实际写入字面量@webroot/cache/...,不是真实路径 - 正确:
file_put_contents(Yii::getAlias('@webroot') . '/cache/data.txt', $content); - 正确:
<img src="<?=%20Yii::getAlias('@web')%20?>/images/logo.png">
别名本身只是字符串标记,必须经 Yii::getAlias() 解析才变成真实路径或 URL;直接使用 @xxx 字面量毫无意义,也绝不安全。











