从 URL 中删除 Yii2 分页中的第一页编号

Removing the number of first page in Yii2 Pagination from the URL

出于 SEO 目的,我需要从 URL 中删除第一页码。即我有以下内容:

example.com/pages/view/1example.com/pages/view这两个URL指向相同的视图动作内容。我想让 URL 中的 1 没有分页。即第一页 link 和页码 1 应该 linked 到 pages/view.

我尝试像下面这样处理 $pagination 对象:

$pages = new Pagination(['totalCount' => $books['booksCount'], 'pageParam' => 'start', 'defaultPageSize' => 10,]);
      $pagingLinks = $pages->getLinks();
      $pagingLinks['first'] = '/';
      $pages->links = $pagingLinks;

然而,导致错误的最后一行:

Setting read-only property: yii\data\Pagination::links

所以我在修改links 属性时遇到了问题。是否有任何其他解决方案来完成此任务?!

According to docs 您应该通过将 yii\data\Pagination::forcePageParam 传递给分页构造函数

来将其设置为 false
$pages = new Pagination([
    'totalCount' => $books['booksCount'], 
    'pageParam' => 'start', 
    'defaultPageSize' => 10,
    'forcePageParam' => false,
]);

以上答案可能适用于直接使用 Pagination,但如果从其他小部件(例如 ListView)使用它,则仍然是一个问题。

我在 github

上的 Yii2 存储库上的 comment on an issue report 找到了解决方案

解决方法就是在config/web.php中定义正确的路由。假设这里我们有一个名为 Suras 的控制器,我们在其名为 view 的操作视图上使用 ListView 小部件。因此,将 defaults 的规则数组设置为 'page' => 1 将阻止将 page 参数添加到第一页的 link 的 URL。还要注意第一个规则 'view/<id:\d+>/1' => 'Error404', 是按顺序放置的,以防止使用 page=1 参数访问第一页,例如,尝试访问 mysite.com/view/20/1 将调用 404 错误,因为有没有名为 Error404 的控制器。

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [                
                'view/<id:\d+>/1' => 'Error404',
                ['pattern' => 'view/<id:\d+>/<page:\d+>', 'route' => 'suras/view', 'defaults' => ['page' => 1]],
                'view/<id:\d+>/<page:\d+>' => 'suras/view',
                'view/<id:\d+>' => 'suras/view',
            ],
        ],


],