如何确保URL的唯一性

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

例如我们有以下规则:

'post/<id:\d+>'=>'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机器人)知道正确的地址.

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

<?php
/**
 * 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 你不应当继承 上述基类,否则你将会使用一个特殊方法来处理它们两个产生的异常。

转载自http://www.yiiwiki.com/wiki/view/id/16/title/%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9DURL%E7%9A%84%E5%94%AF%E4%B8%80%E6%80%A7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值