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.
代替 id
和 title
,在您的数据库中多取一个名为 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
我在项目中配置了 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.
代替 id
和 title
,在您的数据库中多取一个名为 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