Grav 使用复数 URL

在 Grav 中,子页面常常在父页面中以列表的形式展示。在父页面中,使用 @page.children 来定义子页面集合。如果父级页面的文件夹名字是 cases,那么子页面 lado-demo 的链接就是 cases/lado-demo。但 case/lado-demo 明显更合理一些。

方案一:使用单独的文件夹

1. 为子页面建立单数命名的文件夹

创建一个 case 文件夹,并将 lado-demo 移动到其内,现在可以通过 case/lado-demo 来访问这个页面了。

当你编辑 case 页面并保存时,Grav 会自动创建一个 case.md。尽管最初只创建了一个目录,一旦修改保存,就和普通页面没有区别了。为了避免在菜单中显示 case 的链接,将其 visible 设置为否。

尽管网站上并没有直接到 case 页面的链接,但搜索引擎的爬虫、手动输入 URL 失误,都有可能直接访问到一个空白的网页。也许你想到将其设置为不可路由的,不过最简单的办法是设定一个页面重定向,跳转到列表页面 cases

2. 创建复数命名的列表页面

创建页面 cases,并设置:

content:
    items:
        '@page.children': '/case'

在多数主题中使用 page.activeChild 来判断是否应该高亮菜单,而这个方案将子页面的父页面和列表页面一分为二,列表页面对应的菜单项的高亮状态无法正常检测。

方案二:使用 alias

为父页面添加 Canonical 路由

在高级标签页中,为页面 case 增加一个 Canonical 路由 cases。如果你安装了 Sitemap 插件,在 /sitemap.xml 中可以看到,父页面的链接已经变成了 cases,而子页面中仍为 case/lado-demo

不过,在菜单、面包屑导航中,链接仍为 case

修改模板

将菜单和导航模板中的 page.url 改为 page.routeCanonical。如果有些位置没有及时更改,也没有关系,多数主题出于 SEO 的目的,都会在 head 中添加:

<link rel="canonical" href="{{ page.routeCanonical() }}">

顺手为添加一个站点重定向 /case$/cases,就更完美了。

总结

使用以上方法,实现了子页面与列表页面分别使用单数和复数的命名,实际上,子页面和列表页面使用完全不相干的命名也是可以的。