必须同时设置enableprettyurl=>true和showscriptname=>false,缺一不可;前者启用路径式路由,后者隐藏index.php,且需配合web服务器重写规则,否则必现404或url未美化。

直接改 config/main.php 里的 urlManager 配置,再配好 Web 服务器重写规则,就能开启美化 URL —— 但漏掉任一环节都会导致 404 或跳转失败。
enablePrettyUrl 和 showScriptName 必须同时设为 true / false
这两个开关是硬性依赖关系:enablePrettyUrl 控制是否启用路径式路由(如 /post/123),showScriptName 控制是否隐藏 index.php。如果只开前者、关后者,URL 会变成 /index.php/post/123,等于白开;如果只关后者、不开前者,index.php 是藏了,但 ?r=post/view&id=123 还在,根本没“美化”。
-
enablePrettyUrl => true:必须为true,否则所有rules都不生效 -
showScriptName => false:设为false才能去掉index.php,但前提是 Web 服务器已配置重写规则(见下一条) - 别碰
suffix,除非你真要所有 URL 带.html,它会影响Url::to()生成和路由匹配逻辑
Web 服务器重写规则不能省,且 Nginx 和 Apache 写法不同
Yii2 的 urlManager 只负责解析和生成 URL,**不处理请求转发**。没有 Web 服务器把 /post/123 转给 index.php,请求根本进不到框架里,直接 404。
- Apache:在
web/目录放.htaccess,内容必须包含RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d,否则静态资源(JS/CSS/图片)会 404 - Nginx:在
location /块里用try_files $uri $uri/ /index.php?$args;,不要用老旧的if (!-e $request_filename)写法,它在某些条件下会失效 - 确认 rewrite 模块已启用:Apache 查
httpd.conf是否有LoadModule rewrite_module;Nginx 查nginx -V 2>&1 | grep -o with-http_rewrite_module
rules 里正则参数命名必须和 action 参数名一致
比如你定义了 'post/<id:>' => 'post/view'</id:>,那 PostController::actionView() 的签名必须是 public function actionView($id)。Yii2 会把匹配到的 <id:></id:> 值作为命名参数传进去 —— 名字对不上就报 Missing required parameter 错误。
- 参数名大小写敏感:
<id:></id:>匹配成功,但控制器方法若写actionView($id)(小写),就会因参数名不匹配而抛异常 - 多个参数顺序无关,但名字必须完全一致:
'article/<year:>/<month:>' => 'article/archive'</month:></year:>要求actionArchive($year, $month)或actionArchive($month, $year)都可以,只要变量名对得上 - 避免用
<controller:>/<action:></action:></controller:>这类泛匹配规则放在rules末尾,否则可能覆盖你写的精确规则
enableStrictParsing 设为 true 前先清空浏览器缓存和 Yii 缓存
enableStrictParsing => true 表示“只认 rules 里明确定义的 URL,其他一律 404”。这很安全,但上线前容易踩坑:用户书签或搜索引擎收录的老链接(比如带 index.php 或查询参数的)会全部失效。
- 开发阶段建议保持
false,上线前再切true并做全站 URL 映射检查 - 切
true后,务必执行php yii cache/flush-all清掉路由缓存,否则旧规则还在内存里 - 浏览器可能缓存了 301 重定向(尤其 Chrome),测试时用无痕窗口或
curl -I看真实响应头
最常被忽略的是 Web 服务器配置和控制器方法参数名一致性——这两处出错,urlManager 配得再漂亮也跑不起来。











