必须放在 末尾或 开头,推荐 末尾;必须服务端渲染、类型字符串精确无误、多实体建议用 @graph 数组。

script type="application/ld+json" 必须放在 末尾还是 开头?
标准位置只有两个合法选项: 末尾(紧挨 )或 开头(紧挨 )。二者解析成功率无差别,但末尾更稳妥——它不依赖页面 DOM 结构,也不受 CMS 模板截断影响。
常见错误包括:
-
中间插入:某些 SSR 框架或老版 CMS 会提前关闭标签,导致 script 被丢弃 - 嵌在
<div> 或注释里:<code><!-- <script type="application/ld+json">...</script> -->直接失效 - 被另一个
<script></script>包裹:<script>document.write("<script type=...>");</script>不被 Googlebot 解析 - Next.js App Router:用
generateMetadata返回scripts数组,确保输出到 HTML 源码中 - React(CSR):别用
useEffect注入;改用服务端预渲染或静态生成(SSG) - Vue/Nuxt:用
useHead,而非onMounted - PHP 模板:用
json_encode($data, JSON_UNESCAPED_UNICODE)输出,避免手拼 JSON 导致引号或换行崩结构 -
<script type="application/json"></script>—— 缺ld+ -
<script type="application/ld+json "></script>—— 末尾空格 -
<script type="text/json"></script>—— 类型完全不对 -
<script></script>(没写 type)—— 默认是text/javascript,不解析 -
@graph是数组,每个元素是一个完整对象,含自己的@type和字段 - 不要把
@graph套在顶层@context外面——它本身就在 JSON 根层级 - 单实体(如仅 Article)可不用
@graph,直接写对象即可
为什么不能动态插入(比如用 useEffect 或 document.createElement)?
Googlebot 在 2026 年仍不执行 JavaScript,只抓取初始 HTML 流。所有结构化数据必须在服务端渲染时就已存在,否则 Rich Results Test 会显示“未检测到结构化数据”。
对应框架的正确做法:
type="application/ld+json" 写错一个字符就会失效
Google 只认这个精确字符串,大小写、空格、拼写均不可变。哪怕多一个空格或少一个连字符,整个 script 块就被忽略。
典型错误写法:
多实体场景下 @graph 是必须的吗?
不是必须,但强烈推荐。当页面同时需要 Article + BreadcrumbList + Organization 时,用 @graph 数组平级声明,比多个独立 <script></script> 更可靠、更易维护。
注意点:
最常被忽略的其实是验证方式:别信浏览器控制台是否报错,也别信编辑器高亮,唯一可信的是 Google URL Inspection Tool 的实时抓取结果——它反映的是 Googlebot 真实看到的内容。











