如何设置Yii框架路由配置及URL美化规则?
- 内容介绍
- 文章标签
- 相关推荐
本文共计938个文字,预计阅读时间需要4分钟。
直接说结论:
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>块)
正确内容:
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:\d+>' => 'post/view',结果连 /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 形同虚设。
本文共计938个文字,预计阅读时间需要4分钟。
直接说结论:
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>块)
正确内容:
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:\d+>' => 'post/view',结果连 /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 形同虚设。

