URL 中的 Yii2 尾部斜线打破了路线

Yii2 Trailing Slashes in URL is breaking the route

我在项目中配置了 UrlManager,它按照我想要的方式工作。 现在我尝试添加名称包含尾部斜杠的内容,但出现错误 404(未找到对象)。

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

title_of_article = 人们... => 工作

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

尽管尾部斜杠在 %2F

中编码,但它打破了 Url

这就是我创建 url 的方式:

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

我真的不知道该如何处理。

UrlRule 有一个encodeParams 属性。请尝试一下。

为此,最好的解决方案是使用 slug names.

代替 idtitle,在您的数据库中多取一个名为 slug_name 的字段。

在添加或更新任何记录时生成 slug 名称并存储在数据库中。

要生成 slug 名称,您可以使用如下自定义函数。

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;
  }

此函数将return 你的唯一名称。所以你可以在url中使用它。

这对SEO也有帮助。

您可能需要 URL normalization

Since version 2.0.10 UrlManager can be configured to use UrlNormalizer for dealing with variations of the same URL, for example with and without a trailing slash.

注意,默认情况下 UrlManager::$normalizer 被禁用。您需要明确配置它才能启用 URL 规范化。

看这里http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html#url-normalization