要在 yii 3.0 中实现真正 seo 友好的 url,必须同时配置 web 服务器(nginx/apache/宝塔)请求兜底、php 层 urlmanager 的 enableprettyurl/showscriptname/rules 三项设置,以及语义化路由规则,并统一使用 url::to() 生成链接。

要在 Yii 3.0 中让 URL 对搜索引擎真正友好,必须同时打通 Nginx/Apache 的请求兜底、PHP 层 urlManager 的三要素配置、以及路由规则的语义化设计——漏掉任一环,/post/123 就会退化成 /index.php?r=post%2Fview&id=123,Google 不收录,用户也难记住。
Nginx 或 Apache 必须先兜住请求
Yii 3.0 的 urlManager 不负责重写,只负责解析。如果 /blog/hello-world 这个请求没被 Web 服务器转发给 index.php,它根本不会进入框架。
方法一(Nginx 推荐):在站点 location / 块内写入 【try_files $uri $uri/ /index.php?$query_string;】。别用 if 判断文件是否存在,Nginx 官方明确禁止;漏掉 $query_string,GET 参数如 ?utm_source=seo 就会丢失。
方法二(Apache):确保 web/ 目录下存在 .htaccess 文件,内容为:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
注意:Apache 必须启用 mod_rewrite,且对应目录的
方法三(宝塔用户捷径):网站 → 设置 → 伪静态 → 选「Laravel5」模板 → 保存。它自动注入等效于 Nginx try_files 的规则,比手写更可靠,尤其适合上线前快速验证。
PHP 层 urlManager 三项配置缺一不可
这三项必须显式写在 config/web.php 的 components['urlManager'] 中,不能依赖默认值。
第一步:'enablePrettyUrl' => true —— 关闭它,整个美化逻辑直接跳过,所有 URL 都带 query string。
第二步:'showScriptName' => false —— 【若设为 true,生成的链接永远含 /index.php,SEO 权重被稀释】。这是新手最常漏改的一项。
第三步:'rules' 至少有一条兜底规则,例如 '' => 'site/index'。空 rules 数组会导致根路径 / 直接返回 404,爬虫第一次访问就失败。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
这三处必须同时生效,否则前端 link 标签生成的 URL 和后端路由解析完全对不上,页面能打开但 SEO 友好性归零。
写语义化路由规则:让 URL 自带关键词
规则顺序决定匹配优先级,越具体的越靠前,泛匹配放最后。错误顺序会让 /product/123 被当成 controller=product、action=123,而你本意是调用 ProductController::actionView($id)。
方法1:精确匹配(适合固定路径)
'/about' => 'site/about',
'/contact' => 'site/contact'
方法2:参数化路径(推荐用于内容页)
'/blog/
'/product/
注意 slug 正则用 [a-z0-9\-]+ 而不是 \w+,避免下划线和中文混入 URL;










