yii的url美化必须同时满足三件事:yii配置正确、web服务器将请求准确转发给index.php、且不暴露index.php文件名;缺一不可,否则仍出现r=参数或404。

直接说结论:Yii 的 URL 美化不是光改 urlManager 配置就能生效的,必须同时满足三件事——Yii 配置正确、Web 服务器(Apache/Nginx)把请求准确转发给 index.php、且不暴露 index.php 文件名。漏掉任意一环,r=site/index 就会照常出现,或者返回 404。
Yii 配置里 enablePrettyUrl 和 showScriptName 怎么设
这两个参数必须成对设置,缺一不可:
-
enablePrettyUrl设为true:启用 path 格式路由(即去掉?r=) -
showScriptName设为false:隐藏index.php,否则生成的链接仍是/index.php/site/index - 别碰
urlFormat—— Yii2 默认就是'path',显式写反而容易拼错 -
enableStrictParsing建议保持默认false,除非你写了完整规则并想强制匹配;设为true却没覆盖所有路径,就会 404
示例(config/web.php 中):
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [],
],
Apache 下 .htaccess 必须放在 web/ 目录且内容要精简
常见错误是把 .htaccess 放错位置(比如放到项目根目录),或内容抄了带注释/多余指令的版本,导致重写失败。
- 文件必须放在
web/目录下(也就是index.php所在目录) - 核心就三行,别加
RewriteBase或E=PATH_INFO这类过时写法(Yii2 不依赖PATH_INFO) - 确保 Apache 已启用
mod_rewrite,且对应目录允许重写:AllowOverride All(检查<directory></directory>块)
正确内容:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
Nginx 的 try_files 写错一个符号就 404
Nginx 没有 .htaccess,所有逻辑必须写死在 server 配置里。最常出问题的是 try_files 顺序和 $query_string 传参。
-
try_files $uri $uri/ /index.php?$query_string;是标准写法,少?或写成$args可能丢 GET 参数 -
location ~ \.php$块里必须有fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,否则 PHP 找不到脚本 - 别用
rewrite指令模拟 Apache 行为——Nginx 原生支持try_files,更可靠
关键配置片段(server 块内):
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
rules 数组空着也能跑,但加规则前得先确认基础链路通了
很多人一上来就写 'post/<id:>' => 'post/view'</id:>,结果连 /site/index 都打不开,白白浪费时间排查正则。
- 先清空
rules数组(设为[]),只靠 Yii 默认的控制器/动作映射机制验证是否能访问/site/index - 确认基础美化生效后,再加静态规则(如
'about' => 'site/about')或动态规则(注意参数名要和 action 方法签名一致) - 规则里的控制器名必须小写,且不带
Controller后缀;动作名也必须小写,如'user/login'对应UserController::actionLogin()
调试技巧:打开 YII_DEBUG,访问一个不存在的路径,看错误页里是否显示「Unable to resolve the request」——如果是,说明请求已进 Yii;如果直接 404,说明 Web 服务器根本没把请求交给 index.php。
真正卡住人的地方,从来不是 rules 怎么写,而是 Web 服务器有没有把原始请求路径原封不动地交到 index.php 手里。Apache 少一个 AllowOverride All,Nginx 漏掉 $query_string,都会让 enablePrettyUrl 形同虚设。










