如何设置Yii框架路由配置及URL美化规则?

2026-05-08 05:334阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计938个文字,预计阅读时间需要4分钟。

如何设置Yii框架路由配置及URL美化规则?

直接说结论:

Yii 配置里 enablePrettyUrlshowScriptName 怎么设

这两个参数必须成对设置,缺一不可:

  • 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 所在目录)
  • 核心就三行,别加 RewriteBaseE=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框架路由配置及URL美化规则?

直接说结论:

Yii 配置里 enablePrettyUrlshowScriptName 怎么设

这两个参数必须成对设置,缺一不可:

  • 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 所在目录)
  • 核心就三行,别加 RewriteBaseE=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 形同虚设。