TYPO3 10.4:仅2个后台语言下添加多hreflang标签的问题
TYPO3 10.4 tx_seo多hreflang标签解决方案
问题核心
直接在site config.yaml中添加共享同一languageId的语言配置会导致原有语言标签被覆盖,因为TYPO3站点语言配置里languageId是唯一标识,重复配置会触发覆盖逻辑。要生成包含de-CH、de-DE、de-AT、en-US及x-default的hreflang标签,需通过以下两种方法实现:
方法一:通过TypoScript补充额外标签
在站点根模板的TypoScript设置中,直接为tx_seo添加自定义hreflang规则:
config.tx_seo { hreflang { additionalTags { # 生成de-DE标签,复用de-CH(languageId=0)的页面URL 1 { language = de-DE url = TEXT url.data = page:uid url.typolink { parameter.data = page:uid additionalParams = &L=0 returnLast = url forceAbsoluteUrl = 1 } url.replace = /de-ch/|/de-de/ } # 生成de-AT标签 2 { language = de-AT url = TEXT url.data = page:uid url.typolink { parameter.data = page:uid additionalParams = &L=0 returnLast = url forceAbsoluteUrl = 1 } url.replace = /de-ch/|/de-at/ } # 设置x-default标签(指向默认语言de-CH) 3 { language = x-default url = TEXT url.data = page:uid url.typolink { parameter.data = page:uid additionalParams = &L=0 returnLast = url forceAbsoluteUrl = 1 } } } } }
- 调整
url.replace中的路径规则,匹配你的站点语言路径结构 - 如果站点使用域名区分语言,直接替换
url.typolink里的域名即可
方法二:自定义HreflangProvider扩展
需要更灵活的逻辑时,可通过自定义Provider扩展tx_seo的hreflang生成机制:
- 创建自定义Provider类(
Classes/HrefLang/CustomHrefLangProvider.php):
<?php namespace YourVendor\YourExtension\HrefLang; use TYPO3\CMS\Core\Routing\UriBuilder; use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Seo\HrefLang\HrefLangProviderInterface; class CustomHrefLangProvider implements HrefLangProviderInterface { public function generate(array $params): array { $hreflangTags = $params['tags']; $site = $params['site']; $currentPageId = $params['pageId']; // 获取de-CH语言配置及页面URL $deChLang = $site->getLanguageById(0); $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class); $deChUrl = $deChLang->getBase() . $uriBuilder->reset() ->setTargetPageUid($currentPageId) ->setLanguage($deChLang) ->build(); // 添加de-DE、de-AT标签 $hreflangTags['de-DE'] = str_replace('/de-ch/', '/de-de/', $deChUrl); $hreflangTags['de-AT'] = str_replace('/de-ch/', '/de-at/', $deChUrl); // 设置x-default指向de-CH $hreflangTags['x-default'] = $deChUrl; return $hreflangTags; } }
- 在
ext_localconf.php中注册Provider:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seo']['hrefLangProviders']['custom'] = [ 'provider' => \YourVendor\YourExtension\HrefLang\CustomHrefLangProvider::class, 'before' => ['default'], ];
关键注意事项
- 禁止在site config.yaml中配置同一
languageId的多个语言,避免覆盖原有标签 - 确保新增的hreflang URL可访问,建议通过服务器重定向指向对应语言页面,避免重复内容问题
- x-default标签可根据业务需求设置为任意主语言,不一定局限于de-CH
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

