2017-07-31 99 views
0

我在一個項目中配置了UrlManager,它按照我想要的方式工作。 現在我試圖添加一個名稱包含尾部斜線的內容,但我得到一個錯誤404(找不到對象)。Yii2 URL中的尾部斜線正在破壞路線

例如: www.test.com/article/detail/id_of_article/title_of_article

title_of_article = 人們... =>工作

title_of_article = 1/3人是... =>不起作用(找不到對象)

結尾的斜線更是打破了網址,雖然它在%2F

編碼這是我如何創建網址:

Html::a(Html::encode($model->title), 
     ['article/detail', 'id' => $model->id, 'title' => $model->title]) 

我真的不知道我該怎麼面對這一切。

回答

1

對於此,最好的解決方案是使用slu names名稱

取代idtitle,請在數據庫中再添加一個名爲slug_name的字段。

在添加或更新任何記錄時會生成slug名稱並在db中存儲。

爲了生成段塞名稱,可以使用下面的自定義功能。

public function getSlugName($id,$title) 
    { 
    $slug=$id; 
    if(isset($title) && $title!=null) 
    { 
     // remove all spacea 
     $slug.='-'.str_replace(' ','-',strtolower($title)); 
    } 
    $slug=preg_replace('/[^A-Za-z0-9\-]/', '', $slug); // Removes special chars. 
    $slug=str_replace(array('--'), '-', $slug); // remove multiple -- 
    return $slug; 
    } 

此函數將返回您的uniq名稱。所以你可以在網址中使用它。

這也有助於搜索引擎優化。

+0

這是一個好主意。這是真的,它會通過刪除特殊字符來改變標題名稱,但它是一個很好的選擇。 – stfsngue

0

UrlRule有一個encodeParams屬性。請嘗試一下。

0

可能是你需要URL normalization

由於2.0.10版本UrlManager可以被配置爲使用UrlNormalizer 具有相同URL的變化處理,例如與和 沒有結尾的斜線。

注意:默認情況下UrlManager :: $ normalizer被禁用。您需要明確配置它才能啓用URL標準化。

看看這裏如何http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html#url-normalization

+0

我已閱讀過此內容。但它不是SEO友好的。 – stfsngue

+0

@ stfsngue:你的意思是它可以被看作是重複的內容? – Ludo