TYPO3 Extbase默认动作生成重复URL问题及修复方法咨询
问题描述
TYPO3 Extbase路由增强器会因链接是否显式指定动作,为同一默认动作生成不同URL。比如菜单链接是x/,但Fluid的<f:link.action>生成的是x/list/,这会导致内容相同但URL不同,对SEO不友好。
示例场景
站点配置片段如下:
routeEnhancers: xxx: type: Extbase extension: Xxx plugin: Yyy defaultController: 'Zzz::list' routes: - routePath: '/list/' _controller: 'Zzz::list' - routePath: '/details/{ddd-title}/' _controller: 'Zzz::detail' _arguments: ddd-title: ddd aspects: ddd-title: type: PersistedAliasMapper tableName: 'tx_xxx_domain_model_ddd' routeFieldName: 'slug' routeFieldPrefix: '/'
在slug为/ppp/的页面上,插件Yyy用于展示ddd列表(比如汽车类内容),点击项目后会跳转到同一页面的详情页https://domain.tld/ppp/details/some-ddd-title/,这部分表现正常。但在详情页用<f:link.action action="list">返回</f:link.action>生成的返回链接是https://domain.tld/ppp/list/,而非预期的https://domain.tld/ppp/,导致同一内容对应两个不同URL。
解决方法
调整路由配置,添加默认路由匹配
在routes数组中新增一条匹配默认动作的路由,让系统优先使用不带动作名的URL:routes: - routePath: '/' _controller: 'Zzz::list' - routePath: '/list/' _controller: 'Zzz::list' - routePath: '/details/{ddd-title}/' _controller: 'Zzz::detail' _arguments: ddd-title: ddd配置完成后,生成指向
list动作的链接时,系统会优先选用/ppp/而非/ppp/list/。生成链接时省略action参数
既然已将默认控制器设为Zzz::list,可以直接去掉<f:link.action>中的action参数,让系统自动匹配默认动作对应的URL:<f:link.action>返回</f:link.action>这种方式生成的链接会直接指向页面的默认URL
https://domain.tld/ppp/。配置规范URL(Canonical)
如果无法避免生成/list/形式的URL,建议在页面中添加规范标签,指定统一的首选URL,规避SEO风险:
在模板的<head>部分添加:<link rel="canonical" href="{f:uri.page(pageUid: '{data.uid}', absolute: 1)}" />这样搜索引擎会将
/ppp/视为唯一的规范URL,不会因重复内容受到负面影响。
内容的提问来源于stack exchange,提问作者Matteo B.

