DjangoCMS多语言站点菜单语言异常:Googlebot抓取时显示英文
我运营着站点https://www.mobydisc.de/,它支持德语(DE)和英语(EN)两个版本。正常用浏览器访问时,全站内容都是德语;但用Google的抓取检查工具(Googlebot Fetch Details)测试时,页面主体内容是德语,可菜单却变成英语了,这该怎么解决?
当前配置
LANGUAGE_CODE = 'de' TIME_ZONE = 'Europe/Berlin' USE_I18N = True USE_L10N = True USE_TZ = True CMS_LANGUAGES = { 1: [ { 'code': 'de', 'name': gettext('Deutsch'), 'fallbacks': ['en'], 'public': True, }, { 'code': 'en', 'name': gettext('English'), 'fallbacks': ['de'], 'public': True, 'hide_untranslated': True, 'redirect_on_fallback':False, }, ], 'default': { 'fallbacks': ['de'], 'redirect_on_fallback':True, 'public': True, 'hide_untranslated': False, } } LANGUAGES = [ ('de', 'Deutsch'), ('en', 'English'), ]
过滤器代码
@register.filter(name="get_menu_title_without_mega") def get_menu_title_without_mega(text): if megamenu(text): # print("mega remove") regexp = re.compile("[ ]+mega[0-9]+$", re.MULTILINE) # print(text,regexp.sub("",text)) return regexp.sub("",text) else: return text
排查方向与解决方案
从你的配置和现象来看,大概率是Googlebot的请求头触发了菜单的英语版本,而页面主体因为fallback设置正常显示德语。这里给你几个具体的解决思路:
检查语言检测优先级:你的站点可能优先读取请求头里的
Accept-Language字段,而Googlebot的请求头通常带有en相关标识。你可以调整语言解析逻辑,把站点默认语言(de)设为最高优先级,或者针对爬虫请求直接强制返回德语版本,避免被请求头误导。调整CMS语言配置:当前英语语言项的
redirect_on_fallback设为False,而全局默认是True。可以尝试把英语的redirect_on_fallback改成True,确保当没有对应语言内容时,菜单也会 fallback 到德语版本。另外,检查菜单组件是否正确遵循了CMS的语言fallback规则,有没有独立的语言判断逻辑。验证菜单数据源:菜单的内容可能来自独立的语言版本条目,而页面主体用了全局fallback。你需要确认菜单的渲染逻辑是不是在请求语言为德语时,确实读取的是德语菜单数据,而不是错误地加载了英语版本。
明确hreflang标签:在页面头部添加清晰的hreflang标签,告诉Google各个语言版本的对应关系,比如:
<link rel="alternate" hreflang="de" href="https://www.mobydisc.de/" /> <link rel="alternate" hreflang="en" href="https://www.mobydisc.de/en/" /> <link rel="alternate" hreflang="x-default" href="https://www.mobydisc.de/" />这能帮助Googlebot正确识别默认的德语版本,减少语言判断错误。
模拟爬虫请求测试:用curl模拟Googlebot的请求,看看返回内容是否符合预期:
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" -H "Accept-Language: en-US,en;q=0.9" https://www.mobydisc.de/如果返回的菜单确实是英语,那就坐实了是请求头的问题,接下来针对性调整语言解析逻辑即可。
内容的提问来源于stack exchange,提问作者Kirill Marchenko

