簡體   English   中英

具有id和名稱的YII框架中的seo友好URL

[英]seo friendly urls in YII framework with id and name

我一直在搜索Stackoverflow和YII論壇,有很多答案,這對我沒有幫助...

這是我的情況。

我有一個名為: proj的控制器和一個名為view的動作。 它得到: id (int), name (字符串)。

所需的名稱有時帶有特殊字符,例如:[ +,!#$%^&* - ]

所以當我運行createUrl()函數時,它返回的不是那么友好的url。

例如: http//www.qa-mysite.com/proj/1029/Conservation+of+the+Vermont+Salt+Pan+System%2C+Hermanus%2C+South+Africa

id = 1029 name =佛蒙特州SaltPan系統的保護,南非赫曼努斯。

我希望結果如下: http//www.qa-mysite.com/proj/1029/conservation-of-the-vermont-salt-pan-system-hermanus-south-Africa

所以實際上我需要去除特殊字符並將空格之間的分隔符更改為“ - ”而不是“+”。

我目前的curlManager配置是:

'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>false,
            'appendParams' => true,
            'rules'=>array(
            //array('proj/view/<name:\w+>', 'pattern'=>'proj/<id:\d+>'),
                //'<controller:\w+>/<id:\d+>'=>'<controller>/view',
                'proj/<id:\d+>/<name:\w+>'=>array('proj/view', 'caseSensitive'=>false),
                '<controller>/<id:\d+>/<name:.*?>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        )

CreateUrl示例:

$this->createUrl('proj/view', array('id' => $data->id, 'name' => $data->name));

在更改網址后,我需要將舊網站的301重定向到新的友好網址。

注意:我不能做硬編碼的str_replace。

非常感謝您的幫助:]

通過CUrlManagercreateUrl創建自己的url管理器,例如:

class MyUrlManager extends CUrlManager {
    public function createUrl($route,$params=array(),$ampersand='&') {
        if($route == 'proj/view' && isset($params['name'])) {
            $params['name'] = processYourParamFunction($params['name']);
        }
        return parent::createUrl($route,$params,$ampersand);
    }
}

然后修改您的配置以使用此類:

...
'urlManager' => [
    'class' => 'MyUrlManager'
...
]

它是偉大的Yii功能之一,自然反轉控制 :)

問題的第二部分:

在您查看操作中,如果您檢測到不需要的字符,只需使用createurl重定向到新網址。 只要確保你沒有點擊重定向循環。

更新:

要使用301重定向,只需將第三個參數傳遞給重定向代碼以重定向調用:

$this->redirect('route', true, 301);

邊注:

使用cannonical將搜索引擎指向正確的URL

首先,PeterM的答案很好,這是一個很好的方法。

我以不同的方式做到了。

我創建了一個名為“ TextHelper ”的幫助程序 ,它有一個靜態函數:

class TextHelper{
    public static function cleanText($text=""){
        $text = preg_replace('/[^A-Z0-9]+/i', '-', $text);
        $text = strtolower(trim($text, '-'));

        return $text;
    }
}

並改變了createUrl()來獲得由cleanText(清洗),就像這樣:

$this->createUrl('proj/view', array('id' => $proj->id, 'name' => TextHelper::getSlug($proj->name)));

最后,我的config / main.php

'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>false,
            'appendParams' => true,
            'rules'=>array(
                'proj/<id:\d+>/<name:\w+>'=>array('proj/view', 'caseSensitive'=>false),
                '<controller>/<id:\d+>/<name:.*?>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        )

那個解決方案為我完成了這項工作。 希望對於需要面對這個問題的其他開發人員來說,這將是簡單而有效的解決方案。

那個解決方案為我完成了這項工作。 希望對於需要面對這個問題的其他開發人員來說,這將是簡單而有效的解決方案。

'urlManager'=>array(
                'urlFormat'=>'path',
                'showScriptName'=>false,
                'appendParams' => true,
                'rules'=>array(
                    'proj/<id:\d+>/<name:\w+>'=>array('proj/view', 'caseSensitive'=>false),
                    '<controller>/<id:\d+>/<name:.*?>'=>'<controller>/view',
                    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
                ),
            )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM