Yii 3.0 中启用 SEO 需通过 PSR-15 中间件 + 显式响应构建 + 可组合元数据服务控制页面字段;需安装 yii-seo 扩展、注册 SeoService、注入 SeoMiddleware 并在视图中使用 $seo 变量输出动态 meta 标签。

在 Yii 3.0 中为网站启用搜索引擎优化(SEO)配置,不是简单添加 meta 标签或 robots.txt 就能生效的事——它要求你放弃 Yii 2.x 那套全局视图注入或控制器基类统一设置的做法,转而用 PSR-15 中间件 + 显式响应构建 + 可组合的元数据服务来控制每个页面的 title、description、canonical、og:* 等关键字段。PHP 8.2+ 环境下,必须通过容器注册 SEO 服务,并在路由级或控制器级显式调用,否则搜索引擎爬虫看到的仍是空或默认的 HTML head。
配置全局 SEO 元数据服务
第一步:安装官方 SEO 扩展包,执行:composer require yiisoft/yii-seo。该包提供 SeoService 和 SeoMiddleware,不依赖任何框架旧组件,仅需 PSR-11 容器支持。
第二步:在 config/common.php 中注册服务,写入以下配置项:
SeoService::class => [ 'class' => SeoService::class, 'defaultTitle' => '我的网站 - 高性能 PHP 应用', 'defaultDescription' => '基于 Yii 3.0 构建的企业级 Web 应用', 'defaultCanonical' => 'https://example.com',],
注意:【defaultCanonical 必须是完整 HTTPS URL,不能是相对路径或 /】,否则生成的 <link rel="canonical"> 会失效,Google 可能判定为重复内容。
第三步:确保容器自动解析 SeoService 实例,无需手动 new —— Yii 3.0 的 DI 容器会在构造函数中自动注入该服务,只要类型声明正确即可。
在控制器中设置页面级 SEO 信息
方法一:通过构造函数注入 + action 方法内调用
在控制器类中声明依赖:public function __construct(private SeoService $seo) {}
在 actionIndex() 内写:$this->seo->setTitle('首页 - 最新动态与产品介绍');
$this->seo->setDescription('我们提供基于 Yii 3.0 的高性能解决方案,支持 PHP 8.4 JIT 编译与 PSR-15 中间件链');
$this->seo->setCanonical('https://example.com/');
这一步必须在返回响应前调用,否则中间件无法读取到变更值。
方法二:使用属性路由绑定 SEO 配置(推荐用于静态页面)
在控制器方法上添加注解:#[Route('GET /about')]#[Seo(title: '关于我们 - 团队与使命', description: '了解我们的技术理念与开源贡献')]
需要提前安装 yiisoft/yii-seo-attributes 扩展并注册对应中间件,否则注解会被忽略。
启用 SEO 中间件并注入 HTML head
第一步:打开 config/web.php,找到中间件数组配置段。
第二步:在中间件栈中插入 SeoMiddleware::class,位置必须在 ResponseMiddleware::class 之前,否则响应体已生成,无法修改 <head> 内容。
第三步:确认中间件已启用,且其内部调用 $response->withAddedHeader('X-SEO-Enabled', 'true') —— 这个头不是给浏览器看的,而是用于调试时验证中间件是否真正运行。
第四步:在视图模板(如 views/layouts/main.php)中,删除所有硬编码的 <title> 和 <meta name="description"> 标签,改用:<title><?= $seo->getTitle() ?></title> 和 <meta name="description" content="<?= $seo->getDescription() ?>">。
注意:【视图中必须接收 $seo 变量,它由 SeoMiddleware 在渲染前注入到视图上下文】,若直接 echo 或用 $this->seo 会报错,因为视图无控制器作用域。


















