2017-07-31 178 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