FAQ页面应使用https://schema.org/FAQPage类型,每个问答对需以Question为mainEntity,内嵌acceptedAnswer和Answer,且必须用完整HTTPS URL声明itemtype,不可嵌套于Article等其他类型下。

FAQ页面该用哪个schema.org类型?itemtype 必须指向 schema.org 官方定义的结构化数据类型。FAQ 页面对应的标准类型是 https://schema.org/FAQPage,不是 QAPage 或 Article —— 后者语义不匹配,Google 会忽略或报错。
- 必须用完整 HTTPS URL,写成
@#@#@#@#@#@#@#@#@#@0 会被现代搜索引擎(尤其是 Google)拒绝解析
- 不要嵌套在
Article 或 WebPage 下作为子类型;FAQPage 是顶层类型,应直接作用于最外层容器(如 main 或专用 div)
- 如果页面同时含 FAQ 和博客正文,FAQ 部分需单独包裹并声明
itemtype,避免类型污染
问答条目怎么写?用 Question 还是 Answer?
每个问答对必须用 itemprop="mainEntity" 声明为 FAQPage 的主体,且每个主体必须是 Question 类型(https://schema.org/Question),不能直接写 Answer。
-
Question 内部用 itemprop="name" 标题(即问题文本),用 itemprop="acceptedAnswer" 包裹 Answer 对象
-
Answer 必须是 @#@#@#@#@#@#@#@#@#@1 类型,并用 itemprop="text" 包裹纯文本或 HTML 片段(Google 支持带 p、ul 等有限标签)
- 不要省略
acceptedAnswer —— 即使只有一个答案,也必须显式包裹,否则结构无效
<div itemscope itemtype="https://schema.org/FAQPage">
<div itemprop="mainEntity" itemscope itemtype="https://schema.org/Question">
<h3 itemprop="name">缓存失效后如何强制刷新CDN?</h3>
<div itemprop="acceptedAnswer" itemscope itemtype="https://www.php.cn/link/8392a047beb5d88a6531bfc878ccfe3e">
<div itemprop="text"><p>使用 CDN 提供商后台的「刷新缓存」功能,或调用其 API 发送 PURGE 请求。注意:部分 CDN 要求域名已备案且开启权限。</p></div>
</div>
</div>
</div>
常见报错和验证失败原因
Google Rich Results Test 或 Schema Markup Validator 报错,90% 出现在这几个地方:
-
mainEntity 缺失或未设 itemscope + itemtype:只写 itemprop="mainEntity" 不够,必须同时声明类型
- 问题标题用了
h2 但没加 itemprop="name",或把 name 错贴到 Answer 上
-
text 属性值包含 script 标签、iframe、style 标签 —— Google 会直接丢弃整个 Answer
- 多个问答共用一个
mainEntity(应该每个 Question 都是独立的 mainEntity)
- 使用了自定义属性名(如
questionText)代替标准 name 和 text
要不要加 datePublished 或 author?
不需要。FAQPage 类型本身不定义 datePublished、author、description 等字段 —— 这些属于 Article 或 WebPage。强行添加不会报错,但会被忽略,还可能干扰解析。
- 如果想标记更新时间,可用
Question 的 dateCreated 或 dateModified(非必需,仅当有明确时间粒度需求时)
-
author 只能在 Answer 内部用(表示回答者),但 FAQPage 场景下极少需要,且 Google 不展示该信息
- 所有非 FAQPage 规范字段,加了等于白加,还占体积、增维护成本
@#@#@#@#@#@#@#@#@#@0 会被现代搜索引擎(尤其是 Google)拒绝解析 Article 或 WebPage 下作为子类型;FAQPage 是顶层类型,应直接作用于最外层容器(如 main 或专用 div) itemtype,避免类型污染 Question 还是 Answer?
每个问答对必须用 itemprop="mainEntity" 声明为 FAQPage 的主体,且每个主体必须是 Question 类型(https://schema.org/Question),不能直接写 Answer。
-
Question内部用itemprop="name"标题(即问题文本),用itemprop="acceptedAnswer"包裹Answer对象 -
Answer必须是@#@#@#@#@#@#@#@#@#@1类型,并用itemprop="text"包裹纯文本或 HTML 片段(Google 支持带p、ul等有限标签) - 不要省略
acceptedAnswer—— 即使只有一个答案,也必须显式包裹,否则结构无效
<div itemscope itemtype="https://schema.org/FAQPage">
<div itemprop="mainEntity" itemscope itemtype="https://schema.org/Question">
<h3 itemprop="name">缓存失效后如何强制刷新CDN?</h3>
<div itemprop="acceptedAnswer" itemscope itemtype="https://www.php.cn/link/8392a047beb5d88a6531bfc878ccfe3e">
<div itemprop="text"><p>使用 CDN 提供商后台的「刷新缓存」功能,或调用其 API 发送 PURGE 请求。注意:部分 CDN 要求域名已备案且开启权限。</p></div>
</div>
</div>
</div>
常见报错和验证失败原因
Google Rich Results Test 或 Schema Markup Validator 报错,90% 出现在这几个地方:
-
mainEntity 缺失或未设 itemscope + itemtype:只写 itemprop="mainEntity" 不够,必须同时声明类型
- 问题标题用了
h2 但没加 itemprop="name",或把 name 错贴到 Answer 上
-
text 属性值包含 script 标签、iframe、style 标签 —— Google 会直接丢弃整个 Answer
- 多个问答共用一个
mainEntity(应该每个 Question 都是独立的 mainEntity)
- 使用了自定义属性名(如
questionText)代替标准 name 和 text
要不要加 datePublished 或 author?
不需要。FAQPage 类型本身不定义 datePublished、author、description 等字段 —— 这些属于 Article 或 WebPage。强行添加不会报错,但会被忽略,还可能干扰解析。
- 如果想标记更新时间,可用
Question 的 dateCreated 或 dateModified(非必需,仅当有明确时间粒度需求时)
-
author 只能在 Answer 内部用(表示回答者),但 FAQPage 场景下极少需要,且 Google 不展示该信息
- 所有非 FAQPage 规范字段,加了等于白加,还占体积、增维护成本
mainEntity 缺失或未设 itemscope + itemtype:只写 itemprop="mainEntity" 不够,必须同时声明类型 h2 但没加 itemprop="name",或把 name 错贴到 Answer 上 text 属性值包含 script 标签、iframe、style 标签 —— Google 会直接丢弃整个 Answer mainEntity(应该每个 Question 都是独立的 mainEntity) questionText)代替标准 name 和 text datePublished 或 author?
不需要。FAQPage 类型本身不定义 datePublished、author、description 等字段 —— 这些属于 Article 或 WebPage。强行添加不会报错,但会被忽略,还可能干扰解析。
- 如果想标记更新时间,可用
Question的dateCreated或dateModified(非必需,仅当有明确时间粒度需求时) -
author只能在Answer内部用(表示回答者),但 FAQPage 场景下极少需要,且 Google 不展示该信息 - 所有非 FAQPage 规范字段,加了等于白加,还占体积、增维护成本
真正容易被忽略的是:多个 Question 必须平级放在同一个 FAQPage 容器里,不能一层 div 包一个、再用 JS 动态插入 —— 静态 HTML 解析器看不到 JS 渲染后的内容。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











