A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦缠绕的时候 黑马粉丝团   /  2019-1-14 09:30  /  1111 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


很多时候对于 SEO 来说每个页面拥有唯一的地址是很重要的。

例如我们有以下规则:

'post/'=>'post/read',
以下的 URL 是有效的:

post/read/id/5 post/read?id=5 post/5
如果我们有后缀,例如 .html,以下的 URL 是有效的,

post/read/id/5.html post/read.html?id=5 post/5.html
一共有 6 个 URL,这不符合 SEO,

解决的方法很简单,只需在你的控制器(Controller)中写上一下代码:

public function beforeAction($action) { if (Yii::app()->request->url != CHtml::normalizeUrl(array_merge(array($this->route), $_GET))) $this->redirect(CHtml::normalizeUrl(array_merge(array($this->route), $_GET)), true, 301); return parent::beforeAction($action); }
这将会吧所有的 URL 地址转向到指定的一个 '合法地址', 使用301代替302将会使浏览器(google机器人)知道正确的地址.

你可以写一个基类来实现:

/**
* BlockController 是一个自定义的基类.
* 所有需要唯一 URL 的控制器都将继承它. */ class BlockController extends Controller { public function beforeAction($action) { if (Yii::app()->request->url != CHtml::normalizeUrl(array_merge(array($this->route), $_GET))) $this->redirect(CHtml::normalizeUrl(array_merge(array($this->route), $_GET)), true, 301); return parent::beforeAction($action); } }
tip|你不应该将这个规则使用在 actionError 和 actionIndex,所以你如果想给 siteController中的动作使用唯一 URL 你不应当继承 上述基类,否则你将会使用一个特殊方法来处理它们两个产生的异常。

1 个回复

正序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马