3

私はStackoverflowとYIIフォーラムの周りを検索してきました.多くの答えがありますが、役に立たなかった...

これは私の場合です。

projというコントローラーとviewというアクションがあります。id (int)、name (string)を取得します。

[ +,!#$%^&*- ]のような特別な文字が含まれる場合があります。

したがって、createUrl()関数を実行すると、あまりフレンドリーではない URL が返されます。

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

id = 1029 name = 南アフリカ、ヘルマナス、バーモント塩田システムの保護。

結果を次のようにしたい: 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));

URL が変更された後、古い URL を新しい seo に適した URL に301 リダイレクトする必要があります。

注: ハードコーディングされた str_replace は実行できません。

助けてくれてありがとう:]

4

3 に答える 3

3

サブクラス化して独自の URL マネージャーを作成し、少しCUrlManagerovveridecreateUrlします。次に例を示します。

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 の優れた機能の 1 つであり、コントロールの自然な反転です:)

質問の2番目の部分について:

ビューのアクションでは、不要な文字が検出された場合に createurl を使用して新しい URL にリダイレクトするだけです。リダイレクトループに当たらないようにしてください。

アップデート:

301 でリダイレクトするには、リダイレクト コードに 3 番目のパラメータを渡してリダイレクト呼び出しを行います。

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

サイドノート:

cannonicalを使用して検索エンジンを適切な URL に誘導する

于 2013-09-18T11:49:19.950 に答える