Web目录必须指向web/子目录,不能是项目根目录;Apache的DocumentRoot须精确设为web/路径,Windows下路径用正斜杠或双反斜杠,避免单反斜杠转义错误,并确保AllowOverride All启用以支持.htaccess。

Web目录必须指向web/子目录,不能是项目根目录
直接把 Yii2 项目整个丢进 XAMPP/htdocs/myapp,然后访问 http://localhost/myapp/web/index.php,看似能跑,实则埋了三个雷:config/ 目录可被直接下载、URL 带 /web/ 导致重写规则失效、runtime/ 和 assets/ 权限失控。
Apache 的 DocumentRoot 必须精确到 web/ 目录本身。Windows 下路径写法要统一用正斜杠 / 或双反斜杠 \,单反斜杠 会被 Apache 解析为转义符,导致 403 或 500 错误。
- 编辑
C: mpppacheconfextrahttpd-vhosts.conf,追加虚拟主机配置(以 frontend 为例): DocumentRoot "C:/xampp/htdocs/advanced/frontend/web"Directory "C:/xampp/htdocs/advanced/frontend/web"- 确保
AllowOverride All已启用,否则.htaccess不生效
gii 模块只在 YII_ENV_DEV 下加载,环境变量必须在 autoload 前定义
报错 The file or directory to be published does not exist: .../yii2/gii/assets,不是文件丢了,是 gii 根本没注册——框架跳过了整个模块初始化流程。
YII_ENV 必须在 require __DIR__ . '/../vendor/autoload.php'; 之前定义,否则无效。仅改 .env 文件或靠服务器环境变量自动注入,都不保险。
- 打开
web/index.php,确认顶部有: defined('YII_ENV') or define('YII_ENV', 'dev');- 高级模板建议用更健壮的写法:
defined('YII_ENV') or define('YII_ENV', getenv('YII_ENV') ?: 'dev'); - 若用
environments/结构,确保init已执行且 dev 配置被加载
allowedIPs 不是可选项,是安全底线
gii 在开发机上暴露,等同于把数据库结构、模型代码、甚至迁移命令交到外网手里。哪怕只是局域网调试,也绝不能设成 ['*'] 或漏配。
常见疏忽:Docker 容器内访问宿主机 Gii,allowedIPs 里没加宿主机 IP;WAMP/XAMPP 启用 IPv6 后,::1 必须显式列出;公司内网开发时,192.168.1.* 范围太宽,应精确到开发机 IP。
- 配置位置优先选
environments/dev/frontend/config/main-local.php(高级模板)或config/main-local.php(基础模板) - 值必须是数组:
'allowedIPs' => ['127.0.0.1', '::1', '192.168.1.100'] - 修改后必须清空
runtime/cache/,否则旧缓存会绕过新配置
Gii 登录失败常见原因与验证路径
页面显示登录框但输 admin/admin 仍 403,大概率不是密码错,而是路由或权限拦截提前触发。
先确认访问路径是否匹配当前配置:基础模板开启 enablePrettyUrl 后走 /gii;未开启则必须用 ?r=gii;高级模板 backend 路径是 /backend/web/gii 或 /backend/web/index.php?r=gii,取决于入口和 URL 美化设置。
- 检查
urlManager是否允许gii/*路由(尤其开启enablePrettyUrl后) - 查看 Apache
error.log,是否有Forbidden或PHP Fatal error提示 - 临时注释掉
allowedIPs配置,测试能否进入——能进说明 IP 匹配问题,不能进说明模块根本没加载
真正麻烦的是多端口部署时,web.php 和 index.php 里的 baseUrl、scriptUrl 得跟着端口号动态适配,否则生成的 JS/CSS 路径全错——这点容易被忽略,但一错就是整页白屏。


















