WebSite JSON-LD 与站点不一致(修好站名)

WebSite JSON-LD 里的 name / URL 与实际不符,导致 Google 在首页结果上方显示错误站名。如何对齐——以及为什么 SearchAction 那一半已经失效。

你在 Google 搜自己的品牌,首页结果上方的那行站名却是错的——只显示裸域名、旧品牌,或者你那一长串公司法定全称,而不是你想要的短名。view-source 看首页,WebSite JSON-LD 块里的值跟可见站点对不上:name"My AI Site",但 logo 和页脚写的是 “AI Productivity Guide”。Google 把 WebSite 结构化数据当作决定搜索结果中**站名(site name)**的最高优先级信号——但只在 name 跟页面上实际可见的内容一致时才采用。

最快修复:把 JSON-LD 的 name 改成跟首页可见品牌(logo 文字、<title>、页脚)字节级一致,确认 url 是你的 canonical 首页,然后在 Search Console 里对首页请求重新抓取(URL Inspection -> Request Indexing)。新站名通常几天到几周内出现。

2026 年还有用的部分(和没用的部分)

WebSite JSON-LD 过去干两件事,现在只剩一件还活着:

功能截至 2026 年 6 月的状态该怎么做
站名(首页结果上方那行品牌名)有效。 WebSite.name 是 Google 选站名时的最高优先级信号。保持准确——这才是这个块现在还重要的全部原因。
sitelinks search boxpotentialAction / SearchAction已下线。 Google 已于 2024 年 11 月 21 日全球移除。标记留着无害,但不起任何作用。别再为了 Google 去修搜索 URL 模板。

第二行是最大的变化。如果你是来修一个坏掉的 SearchAction.target URL、想让搜索框重新出现的——停下,已经没有搜索框可修了。Google 已彻底移除 sitelinks search box,把对应报告从 Search Console 撤掉,Rich Results Test 里也不再高亮这段标记。把旧的 potentialAction 留在 JSON-LD 里不会触发错误,只是变成了死代码。本文剩下的部分只聚焦还能产生可见结果的那部分:站名。

常见原因

按”实际命中率”从高到低排列。

1. name 用了旧 / 占位 / 太泛的品牌

starter template 自带 name: "My Site" 没人改。或者改了品牌但 JSON-LD 生成器还在吐旧名。Google 也会忽略太泛的名字(“Home”、“Blog”),或者读起来像一长串法定实体(“Acme Productivity Solutions LLC”)而不是短品牌的名字。

怎么判断:

curl -s https://yoursite.com/ | grep -oP '"@type":"WebSite"[\s\S]+?</script>' | grep -oP '"name":"\K[^"]+'

输出跟可见 logo / 页脚名不一样,或者是个泛词,就是这条。

2. name 跟首页可见品牌不一致

这是 Google 自己最强调的原因。结构化数据写 “AI Productivity Guide”,但 <title> 写 “Home | AIPG”,og:site_name 写 “AI Prod Guide”,logo alt 文字又是另一个。信号互相打架时,Google 往往退回到裸域名。

怎么判断: 对比首页这四个值,它们应该是同一个短字符串:

curl -s https://yoursite.com/ | grep -oE '<title>[^<]+|og:site_name" content="[^"]+|"name":"[^"]+'

3. url 与 canonical 的尾斜杠不一致

JSON-LD:"url": "https://yoursite.com"。Canonical:https://yoursite.com/。Google 看到两个略不同的 URL 都声称是站点根。WebSite.url 必须指向你的 canonical 首页,即域名(或子域名)根。

怎么判断: 对比 WebSite.url 跟首页的 rel="canonical"。必须字节级一致、无跳转。

4. WebSite 结构化数据放在子目录而非域名/子域名根

站名只在域名或子域名根上生效。如果你的”站点”在 yoursite.com/blog/,而你把 WebSite 块放在那里,Google 不会为某个子目录单独取站名——子目录站名不被支持。需要不同的名字就用子域名。

怎么判断: 确认 WebSite 块在裸根(/ 或像 /en/ 这样的 locale 根)服务的那个页面上,而不是某个内层路径。

5. inLanguage<html lang> 不一致

JSON-LD:"inLanguage": "en"。HTML:<html lang="en-US">。属于小问题,但也值得对齐,免得两处互相矛盾。

怎么判断:

curl -s https://yoursite.com/ | grep -oE '<html[^>]+lang="[^"]+"|"inLanguage":"[^"]+"'

6. 同页多个 WebSite 块

有些模板从 layout 文件和单独的站级 schema 组件都吐 WebSite。Google 看到一个站点有两个块;如果它们的 name 不一致,信号就被搅浑。

怎么判断:

curl -s https://yoursite.com/ | grep -c '"@type":"WebSite"'

大于 1 就是重复。选一个源,删另一个。

7. @id 引用了遗留域名

"@id": "https://yoursite.com/#website" 没问题。"@id": "https://oldsite.com/#website" 是换域名时留下的,应当改掉。

怎么判断:@id 有没有遗留域名或格式错误。

8. 新域名、品牌认知度弱

如果域名很新,Google 会依赖它还没积累到的站外信号,这时不管标记怎么写都可能显示裸域名。解法是 alternateName 加上耐心(见下面第 4 步)。

最短修复路径

第 1 步:定义单一可信源

site.config.mjs 或类似文件里:

export const SITE = {
  name: "AI Productivity Guide",       // 短、好记、跟 logo 一致
  url: "https://yoursite.com",         // canonical 首页,别有尾斜杠漂移
  inLanguage: "en",                    // 或 "en-US",匹配 <html lang>
};

第 2 步:从中生成 WebSite 块——只在首页

---
import { SITE } from '../site.config.mjs';
const isHomepage = Astro.url.pathname === '/' || Astro.url.pathname === '/en/';
---
{isHomepage && (
  <script type="application/ld+json" set:html={JSON.stringify({
    "@context": "https://schema.org",
    "@type": "WebSite",
    "@id": `${SITE.url}/#website`,
    "url": SITE.url,
    "name": SITE.name,
    "inLanguage": SITE.inLanguage,
  })}></script>
)}

注意少了什么:没有 potentialAction / SearchAction。它已经不起任何作用(见上面的表),所以最干净的写法直接不写。已有的留着也无妨,但新标记不需要它。

第 3 步:对齐四个可见信号

首页上,这几个应当是同一个短字符串:

  1. <title>(至少其中的站名部分),
  2. og:site_name meta 标签,
  3. logo 的 alt 文字 / logo 旁边的文字,
  4. WebSite JSON-LD 的 name

这里不一致,是 Google 显示裸域名而非你站名的头号原因。

第 4 步:站名还是不生效就加 alternateName

如果正确的名字被忽略——新域名上很常见——给 Google 一些备选。按优先级排序,新站可以把裸域名放在最后兜底:

{
  "@type": "WebSite",
  "name": "AI Productivity Guide",
  "alternateName": ["AIPG", "yoursite.com"],
  "url": "https://yoursite.com"
}

别拿 alternateName 去夹带一个 Google 在别处正在拒绝的名字——它必须跟你真实的品牌一致,否则照样被忽略。

第 5 步:删除重复的 WebSite 块

grep -rn 'WebSite' src/layouts src/components

留一个源,其余删掉。

第 6 步:校验标记

部署后,在 Rich Results TestSchema Markup Validator 打开首页。确认 WebSite 类型能解析、无错误,且 name 是你预期的那个。(Rich Results Test 不再标出 sitelinks search box——这是正常的,不是失败。)

第 7 步:请求重新抓取,然后等

在 Search Console 里对首页 URL 跑 URL Inspection,点 Request Indexing。站名变更不是即时的:Google 要重新抓取并重新处理首页,这要几天到几周。站名功能没有任何 Search Console 报告,唯一确认方式是等重抓完成后搜自己的品牌。

如何确认修好了

  1. 标记能解析: Rich Results Test / Schema Markup Validator 显示 WebSitename 是你想要的,且无错误。
  2. 只有一个块、值一致: 对线上首页跑 grep -c '"@type":"WebSite"' 返回 1,且 name<title>og:site_name、logo 文字读出来都是同一个短品牌。
  3. 重抓已完成: URL Inspection 显示首页最近一次抓取时间晚于你的部署时间。
  4. SERP 更新: 几天到几周后,搜你的品牌,首页结果上方显示正确站名。

哪些情况不是你操作错了

即使 WebSite JSON-LD 完美无瑕,Google 选站名是全自动的,会权衡你无法直接控制的站外信号。一个站外提及很少的全新域名,不管标记怎么写,都可能在一段时间里继续显示裸域名。而 sitelinks search box 自 2024 年 11 月起已经彻底没了——再正确的 SearchAction 标记也救不回来,因为这个功能本身已经在 Search 全球范围内被撤掉。

FAQ

  • 要不要删掉旧的 SearchAction / potentialAction 标记? 不必。它是死代码,不会在 Search Console 报错。新标记直接不写即可。
  • 为什么 Google 显示我的域名而不是站名? 通常是不一致(原因 2),或名字太泛 / 太长(原因 1)。对齐四个可见信号、加 alternateName、请求重抓。
  • 新名字多久出现? Google 重抓首页后几天到几周。在 URL Inspection 里请求索引加快的是抓取,而不是 Google 的处理。
  • 站名有 Search Console 报告吗? 没有。Google 撤掉了 sitelinks-search-box 报告,也从没给站名加过报告——只能靠搜品牌来验证。
  • 一页能声明多个 WebSite 块吗? 不能。首页上只放一个;互相冲突的块会搅浑站名信号。

预防建议

  • 用单一 SITE 配置作为站名和 canonical URL 的可信源。
  • WebSite JSON-LD 只在首页发(双语站只在该 locale 首页)。
  • CI 断言:首页有且只有一个 WebSite 块,且它的 name 等于你配置的品牌。
  • 改品牌时同步改 WebSitename,并随后请求首页重抓。
  • 新标记别再加 SearchAction——它在 Google Search 里已经不渲染任何东西。

相关阅读

标签: #SEO #排查 #排查 #结构化数据 #WebSite Schema #JSON-LD