九年前,我写了一篇关于个人项目被Google、Bing和Yandex收录的文章。今天的这篇,是那个故事的尴尬后续:同一个多语言配置里,有个东西一直在悄悄拖我的后腿,而且全程没报过一次错。
DukoTools支持5种语言:英语、西班牙语、阿拉伯语、法语和乌尔都语。112个工具,页头有语言切换器,每个页面都带hreflang标签,告诉搜索引擎"这是西班牙语版本,那是阿拉伯语版本"。
![]()
我一直以为,只要/ar/tools/some-tool这个页面存在,就说明阿拉伯语翻译也做好了。这个假设,在22个工具上都是错的。而我发现这个问题,是因为有人在上一篇博客下面留了条评论。
一个页面可以返回HTTP 200,声明lang="ar",通过hreflang宣称自己是该页面的权威阿拉伯语版本,然后正文里渲染的却是100%的英文。
这就是所谓的软404(soft 404)。它对人类完全隐形——访客看到的是一个正常页面,没有任何异常。但爬虫看到的,是一个声称自己是某种语言、实际内容却完全不是的页面。搜索引擎会把这种不匹配当作信任信号,而且是错误的那种。
问题出在重复的硬编码
"这个工具支持哪些语言"的逻辑,被复制粘贴在了五个不同的地方:
LanguageSwitcher.tsx里定义了LOCALES = ['en', 'es', 'ar', 'fr', 'ur']toolMetadata.ts(生成hreflang)里又定义了一遍page.tsxgenerateStaticParams里再来一遍sitemap.ts里还有一份
同一个数组,写了四遍。每一处都假设所有工具都有全部5种语言的翻译,但没有任何一处去验证这个假设。当某个工具的翻译不存在时,内容组件是这样处理的:
const localeAbout = messages.toolAbout?.[slug];const displayAbout = localeAbout ?? content.about; // 静默回退到英文这个??回退逻辑,看起来非常合理。但它恰恰就是构建一个"对自己语言撒谎的页面"的标准做法。
修复方案:单一数据源
正确的做法,是把"这个工具到底支持哪些语言"收敛到一个函数里:
// lib/toolLocales.tsexport function getAvailableLocales(slug: string): AppLocale[] {return ALL_LOCALES.filter(locale =>locale === 'en' || hasRealTranslation(slug, locale)}所有消费方——语言切换器、hreflang生成器、generateStaticParams、sitemap——都从这个函数读取,而不是各自维护一份硬编码数组。如果一个工具没有阿拉伯语翻译,getAvailableLocales就不会包含'ar',generateStaticParams就不会构建那个页面,请求它就会返回真正的404。
export const dynamicParams = false; // 拒绝任何不在 generateStaticParams 里的组合export default async function ToolPage({ params: { locale, slug } }: Props) {if (!isLocaleAvailableForTool(locale, slug)) notFound();}这次踩坑,给我留下了三个教训
第一,"看起来正常"不等于"真的正常"。软404是SEO里最阴险的问题之一,因为它不报错、不红屏、不崩溃,人类用户永远发现不了。只有搜索引擎会默默记下这笔账。
第二,重复代码是技术债的温床。同一个语言列表在五个地方各写一份,任何一个地方更新了、其他地方没跟上,就会产生这种"半真半假"的状态。单一数据源(single source of truth)不是教条,是防呆设计。
第三,回退逻辑要显式,不要静默。?? content.about这种写法,把"翻译缺失"这个异常情况悄悄吞掉了。如果改成显式检查——翻译不存在就报错、或者干脆不生成这个页面——问题在开发阶段就会暴露,而不是等到搜索引擎降权才被发现。
如果你也在做多语言站点,花十分钟检查一下:你的语言列表是集中管理的,还是散落在各个文件里?你的页面在翻译缺失时,是返回404,还是静默渲染默认语言?
这个问题不报错,但它一直在扣你的信任分。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.