关于 seo-technical
seo-technical 是用于技术 SEO 审计的技能,面向网站运营和搜索优化人员。它检查抓取与索引、移动体验、结构化数据、安全性及 JavaScript 渲染,并提供相关诊断指导。
主要功能
- 01检查抓取与索引问题
- 02审查 URL 与重定向结构
- 03检查移动端体验和 Core Web Vitals
- 04检测结构化数据
- 05分析 JavaScript 渲染与内容可见性
- 06审查安全标头及爬虫规则
适用场景
- 01排查重要页面无法抓取或收录的原因
- 02检查移动端与桌面端内容一致性
- 03评估 Core Web Vitals 和页面体验
- 04审查 robots.txt 中 AI 爬虫规则
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ agricidaniel/ claude-seo --skill seo-technical安装后在 Claude Code 中输入/seo-technical确认已加载。
附带文件LICENSE.txtreferences/stack-cve-exposure.md
详细介绍
技术 SEO 审核
类别
1. 可抓取性
- robots.txt:文件存在且有效,没有屏蔽重要资源
- XML 站点地图:运行
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run sitemap_discovery.py <url> --json;要求found中存在有效条目,并将过时或不安全的 robots.txt 声明与有效的备用位置分别报告 - Noindex 标签:有意设置还是意外设置
- 抓取深度:重要页面距首页不超过 3 次点击
- JavaScript 渲染:检查关键内容是否需要执行 JS(方法见第 8 节)
- 抓取预算:对于大型网站(>10k 个页面),抓取效率很重要
- Googlebot 抓取限制:Googlebot 抓取前 2MB 的 HTML 和前 64MB 的 PDF(未压缩;15MB 是更广泛的爬虫基础设施默认值)。这项限制已长期存在,并非 2026 年的新变化;但内联 base64 图片、超大的内联 CSS/JS 或臃肿的导航可能会使关键内容/JSON-LD 超出限制,无法被收录。请确保关键内容和结构化数据位于前 2MB 内。
- 抓取速率会自动调整(遇到 5xx 错误/响应缓慢时会降低);无法手动控制抓取速率(旧版 Search Console 设置已于 2024 年 1 月移除)。可通过站点地图、服务器响应速度和 robots 控制来影响抓取。
- Google 的规范抓取/robots 参考文档已迁移至 developers.google.com/crawling(迁移日期:2025-11-20);IP 范围文件已移至
/crawling/ipranges/,且googlebot.json已重命名为common-crawlers.json。 - AMP 不具备单独的排名优势。自 2026-07-01 起,Google 搜索会将用户直接引导至由发布者托管的 AMP URL,因此不应建议维护 AMP Cache、AMP Viewer 或 signed exchange。审核 AMP 时,应确保其符合与其他页面相同的内容、操作一致性和质量要求。
AI 爬虫管理
截至 2025-2026 年,AI 公司会主动抓取网络内容来训练模型并支持 AI 搜索。通过 robots.txt 管理这些爬虫,是一项重要的技术 SEO 考量。
已知的 AI 爬虫(包含各爬虫对应 robots.txt 行为的权威表格见 seo-geo):
| 爬虫 | 公司 | robots.txt 令牌 | 用途 |
|---|---|---|---|
| GPTBot | OpenAI | GPTBot | 模型训练(不用于 ChatGPT Search) |
| OAI-SearchBot | OpenAI | OAI-SearchBot | ChatGPT Search 的引用资格 |
| ChatGPT-User | OpenAI | ChatGPT-User | 实时浏览(由用户触发) |
| ClaudeBot | Anthropic | ClaudeBot | 模型训练(不用于 Claude 搜索引用) |
| Claude-SearchBot | Anthropic | Claude-SearchBot | Claude 搜索结果的引用资格 |
| PerplexityBot | Perplexity | PerplexityBot | Perplexity 搜索索引(不用于模型训练) |
| Bytespider | ByteDance | Bytespider | 模型训练 |
| Google-Extended | Google-Extended | Gemini 训练与 grounding,以及为 Search 生成式 AI 功能提供支持的模型训练(不影响 Search 收录或排名) | |
| Applebot-Extended | Apple | Applebot-Extended | 选择退出 Apple Intelligence 训练(不影响 Siri/Spotlight/Safari) |
| CCBot | Common Crawl | CCBot | 开放数据集 |
重要区别:
- 屏蔽
Google-Extended会阻止 Gemini 训练和 grounding 使用(以及为 Search 生成式 AI 功能提供支持的模型训练),但不会影响 Google Search 索引或 AI Overviews(它们使用Googlebot) - 屏蔽
GPTBot会阻止 OpenAI 训练,但不会影响 ChatGPT Search 的引用资格,后者由OAI-SearchBot控制;也不会影响由用户触发的浏览(ChatGPT-User)。任何关于引用资格的说法都应查看OAI-SearchBot;GPTBot状态只能作为训练用途的证据 - 屏蔽
ClaudeBot会阻止 Anthropic 模型训练,但不会影响 Claude 自有搜索功能中的引用资格,后者由Claude-SearchBot控制(根据 Anthropic 的爬虫支持文章)。任何关于 Claude 搜索引用资格的说法都应查看Claude-SearchBot;ClaudeBot状态只能作为训练用途的证据 - 屏蔽
Applebot-Extended会选择退出 Apple Intelligence / 生成式模型训练用途,但不会影响通过 Siri、Spotlight 或 Safari 发现内容;这些功能遵循Applebot的规则(根据 Apple 的支持文章);Applebot-Extended本身不会抓取内容
选择性屏蔽 AI 爬虫示例:
# Allow search indexing, block AI training crawlers
User-agent: GPTBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: Bytespider
Disallow: /
# Allow all other crawlers (including Googlebot for search)
User-agent: *
Allow: /
建议: 屏蔽前请考虑你的 AI 可见性策略:屏蔽 AI 搜索爬虫会导致网站从该引擎的回答中移除。不要承诺允许爬虫访问就能带来流量。完整的 AI 爬虫/抓取器分类请参阅 seo-geo 技能。
Google 的用户触发型抓取器通常会忽略 robots.txt 规则(其他厂商有所不同:Anthropic 的 Claude-User 会遵守这些规则)。Google 现在将 Google-Agent(用户触发的 Agent 式浏览)、Google-GeminiNotebook(原名 Google-NotebookLM)和 Google Messages 列为用户触发型抓取器,且无法通过 robots.txt 屏蔽。请改用服务器端访问控制。相比之下,
Google-Extended和Google-CloudVertexBot会遵守 robots.txt。新兴方案:Web Bot Auth(RFC 9421)允许机器人通过Signature-Agent标头和位于agent.bot.goog的密钥目录进行加密身份验证(Google-Agent 使用此方案);反向 DNS 验证仍是备用方案。
2. 可索引性
- 规范标签:指向自身,且不与 noindex 冲突
- 重复内容:近似重复内容、带参数的 URL、www 与非 www 版本
- 修复规范化问题可能需要时间:Google 重新评估时,可能会将已修正的页面继续保留在重复内容集群中最长两周。修复后规范 URL 未立即变化,并不意味着修复失败。
- 内容单薄:低于各类页面最低字数要求的页面
- 分页:为每个页面提供可抓取的
<a href>链接(Google 已不再使用 rel=next/prev;该公司于 2019 年宣布了这一点);为每个页面设置指向自身的规范 URL;“加载更多”和无限滚动功能需要提供对应的分页 URL - Hreflang:适用于多语言/多地区网站
- 索引膨胀:不必要的页面占用抓取预算
3. 安全性
- HTTPS:强制启用、SSL 证书有效、无混合内容
- 安全标头:
- Content-Security-Policy (CSP)
- Strict-Transport-Security (HSTS)
- X-Frame-Options
- X-Content-Type-Options
- Referrer-Policy
- HSTS 预加载:对于高安全性网站,检查其是否列入预加载列表
- 后退按钮劫持(违反垃圾内容政策、属于恶意行为):标记通过
history.pushState/replaceState使后退按钮失效的页面(包括由第三方广告/库平台注入的脚本)。Google 于 2026-04-13 将其纳入垃圾内容政策;自 2026-06-15 起正式执行(包括人工处置和自动降权):应将其视为严重问题。 - 服务器技术栈 CVE 暴露(仅限只读、经所有者授权的网站):检测网站是否运行存在已知严重 CVE 的服务端技术栈,以便所有者修补或将其下线。通过正常响应中的信息读取技术栈(
X-Powered-By、Set-Cookie: PHPSESSID、WordPresswp-json/generator信号,以及_next/static等静态/Node 标记);绝不进行模糊测试或发送漏洞利用载荷,也绝不探测运营者无权控制的网站。当前 PHP 严重 RCE 公告(CVE-2026-109618 / CVE-2026-109619,CVSS 9.2,已在 PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 中修复)、检测信号和报告等级见references/stack-cve-exposure.md。确认 PHP 版本低于已修复版本时,应视为严重问题;没有 PHP 信号的托管服务或静态主机不受此公告影响。
4. URL 结构
- 简洁的 URL:描述性强,使用连字符,内容页面不带查询参数
- 层级:符合网站架构的逻辑文件夹结构
- 重定向:不得形成链式跳转(最多 1 次跳转),永久迁移使用 301
- URL 长度:标记超过 100 个字符的 URL
- 末尾斜杠:保持使用方式一致
5. 移动端优化与页面体验
- 响应式设计:viewport meta 标签、响应式 CSS
- 触控目标:WCAG 2.2 AA 要求至少为 24x24 CSS px;带间距的 48x48px 是舒适的建议值(并非 Google 要求)
- 字体大小:无需缩放即可阅读(16px 基础字号是常见做法,并非 Google 规定)
- 不出现水平滚动
- 移动优先索引:Googlebot Smartphone 是主要抓取工具(已于 2024 年完成推广)。并非严格要求提供移动版(Google 称其为“强烈推荐”);无法在移动设备上正常使用的网站仍可能被编入索引,但真正的风险是内容/一致性缺失,而非被彻底排除。
- 移动端/桌面端内容一致性(价值最高的移动端检查):主要内容等效、robots meta 标签一致、标题/描述一致、结构化数据等效、资源可抓取;避免将需要用户交互才能加载的主要内容设为延迟加载。
- 侵入式插页广告/广告密度:标记全屏插页广告、独立的同意后重定向页面、持续阻挡内容的对话框,以及过多或分散注意力的广告密度(这是一个具名的页面体验方面)。可接受的情况:小型横幅、标准 CMS/法律声明对话框。
- “阅读更多”深层链接:确保关键内容在页面加载时立即可见(不要藏在标签页/折叠面板后),加载时不要劫持滚动,并保留 URL 哈希片段;隐藏在可展开部分后的内容较不容易符合要求。
页面体验是指导原则,并非单一的排名系统。只有 Core Web Vitals 会直接影响排名;HTTPS 是已确认但权重较低的信号(Google 在 2014 年宣布时称其权重非常低)。即使页面体验欠佳,相关性仍可能胜出,因此不要过度看重安全标头。注意:Search Console 已移除独立的页面体验报告(通过 Core Web Vitals 和 HTTPS 报告进行监控)。
6. Core Web Vitals
- LCP(Largest Contentful Paint,最大内容绘制):目标 <=2.5s
- INP(Interaction to Next Paint,下一次绘制交互):目标 <=200ms
- INP 于 2024 年 3 月 12 日取代 FID。FID 于 2024 年 9 月 9 日从 Chrome 的现场数据工具(CrUX API、PageSpeed Insights)中移除(Lighthouse 是实验室工具,从未报告 FID)。任何地方都不要提及 FID。
- CLS(Cumulative Layout Shift,累积布局偏移):目标 <=0.1
- 使用真实用户数据的第 75 百分位数进行评估
- 如果 MCP 可用,则使用 PageSpeed Insights API 或 CrUX 数据
7. 结构化数据
- 检测:JSON-LD(首选)、Microdata、RDFa
- 根据 Google 支持的类型进行验证
- 完整分析请参阅 seo-schema skill
8. JavaScript 渲染
- 方法:
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run agentic_check.py <url> --json会报告原始 HTML 中可见的字数(server-rendered);Chromium 可用时,可与render_page.py <url> --mode always --json的结果进行比较。如果没有 Chromium,则报告原始 HTML 的结果,并说明未比较渲染后的内容。 - 检查内容是在初始 HTML 中可见,还是需要 JavaScript
- 识别客户端渲染(CSR)与服务器端渲染(SSR)
- 标记可能导致索引问题的 SPA 框架(React、Vue、Angular)
- 如果检测到动态渲染,将其标记为技术债务,而非有效配置。 Google 将其称为“一种变通方法,并非推荐的解决方案”,因为它会增加 复杂性和资源成本。 请参阅 https://developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering
推荐的渲染策略:
| 策略 | 使用场景 |
|---|---|
| SSR | 面向公众的 SEO 内容、动态页面 |
| SSG | 静态内容、博客、文档 |
| CSR | 仅限已通过身份验证/需要登录的内容 |
首选框架: Next.js、Astro、React Router v7 (Remix)、SvelteKit
JavaScript SEO:规范链接与索引指南(2025 年 12 月)
Google 于 2025 年 12 月更新了 JavaScript SEO 文档,并对以下内容作出了重要说明:
- **规范链接冲突:**如果原始 HTML 中的规范链接标签与 JavaScript 注入的标签不同,Google 可能会采用其中任意一个。请确保服务器渲染的 HTML 与 JS 渲染的输出中的规范链接标签完全一致。
- **JavaScript 与 noindex:**如果原始 HTML 中包含
<meta name="robots" content="noindex">,但 JavaScript 将其移除,Google 仍可能遵循原始 HTML 中的 noindex 指令。请在初始 HTML 响应中提供正确的 robots 指令。 - **非 200 状态码:**对于返回非 200 HTTP 状态码的页面,Google 不会渲染 JavaScript。通过 JS 在错误页面中注入的任何内容或 meta 标签,Googlebot 都无法看到。
- **JavaScript 中的结构化数据:**通过 JS 注入的 Product、Article 和其他结构化数据可能会延迟处理。对于有时效性的结构化数据(尤其是电商 Product 标记),请将其包含在初始服务器渲染的 HTML 中。
**最佳实践:**请在初始服务器渲染的 HTML 中提供关键的 SEO 元素(规范链接、meta robots、结构化数据、标题、meta 描述),而不是依赖 JavaScript 注入。
9. IndexNow 协议
- 检查网站是否支持 Bing、Yandex 和 Naver 的 IndexNow
- 除 Google 以外的搜索引擎也支持该协议
- 建议实施该协议,以加快网站在非 Google 搜索引擎中的索引速度
Agent 友好页面与 Agent 式浏览
Agent 就绪度有自己的子技能:/seo agentic <url>(seo-agentic)。
该子技能负责 Lighthouse 的 Agent 式浏览类别(以分数占比表示,即 X/N,而非 0 到 100 的分数)、面向 Agent 的无障碍树、AI Agent 访问策略、llms.txt、Markdown 交付、ai-catalog.json、/.well-known 发现文件,以及 WebMCP。在技术审计期间,只记录以下两项信号,其余内容请参阅
seo-agentic:
- JS 渲染:如果原始 HTML 中缺少主要内容,不运行 JavaScript 的 Agent 也无法看到这些内容。
- robots.txt 返回 5xx;遵循规范的爬虫会将其视为“禁止访问所有内容”。
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run agent_ux_check.py https://example.com --json
上方的 Agent-UX 0-100 分数是一种本地启发式指标。请将其与 Lighthouse 分数占比区分开来,并将其结果作为优化机会呈现,而非失败项。Lighthouse 的 agent-accessibility-tree 审计未通过则是另一回事:seo-agentic 将其评为 P0,因为这是 Google 自行测量的检查项。
输出
技术分数:XX/100
仅对已测量的内容评分。每个类别的分数表示该类别中通过的检查所占比例,并根据严重程度进行调整;无法测量的类别应标记为“未测量”,不得给出数字。列出每个分数对应的检查项。
类别明细
| 类别 | 状态 | 分数 |
|---|---|---|
| 可抓取性 | pass/warn/fail | XX/100 |
| 可索引性 | pass/warn/fail | XX/100 |
| 安全性 | pass/warn/fail | XX/100 |
| URL 结构 | pass/warn/fail | XX/100 |
| 移动端 | pass/warn/fail | XX/100 |
| Core Web Vitals | pass/warn/fail | XX/100 |
| 结构化数据 | pass/warn/fail | XX/100 |
| JS 渲染 | pass/warn/fail | XX/100 |
| IndexNow | pass/warn/fail | XX/100 |
严重问题(立即修复)
高优先级(1 周内修复)
中优先级(1 个月内修复)
低优先级(纳入待办)
DataForSEO 集成(可选)
如果有可用的 DataForSEO MCP 工具,请使用 on_page_instant_pages 进行实际页面分析(状态码、页面耗时、失效链接、页面检查),使用 on_page_lighthouse 进行 Lighthouse 审计(性能、无障碍、SEO 分数),并使用 domain_analytics_technologies_domain_technologies 检测技术栈。
Google API 集成(可选)
如果已配置 Google API 凭据,可使用 "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run pagespeed_check.py <url> --json 获取真实的 PSI + CrUX 字段数据(替代仅实验室数据的 CWV 估算),使用 "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run crux_history.py <url> --form-factor PHONE --json 获取 25 周的 CWV 趋势(使用 PHONE:所有设备视图可能会掩盖移动设备上的问题),并使用 "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run gsc_inspect.py <url> --json 获取每个 URL 的真实索引状态。
审计本地或私有主机
url_safety 默认会拒绝环回地址和私有地址,因此 http://localhost:3000 和 Tailscale 上的预发布主机都会报错:“Blocked hostname” 或 “Blocked IP literal”。这是刻意设置的默认行为:这些脚本会访问在抓取页面上发现的 URL。
若要审计部署前的主机,操作人员需在 CLAUDE_SEO_LOCAL_TARGETS 中指定该主机。这是一个以逗号分隔的 host 或 host:port 条目列表:
CLAUDE_SEO_LOCAL_TARGETS="localhost:3000,127.0.0.1:8080,100.101.102.103" \
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run fetch_page.py http://localhost:3000/
允许列表主机的适用范围:
| 行为 | 允许列表中的主机 |
|---|---|
| 通过原始 HTTP 访问的首个顶层 URL | 允许 |
| 从该 URL 跳转到的目标 | 拒绝 |
| 渲染页面获取的子资源 | 拒绝 |
Playwright 渲染(--render、截图) | 拒绝;请使用原始 HTTP 路径 |
| 未在变量中指定的主机 | 拒绝 |
| 云元数据端点,即使已列出 | 拒绝 |
host:port 仅匹配该端口;单独的 host 则匹配任意端口。未设置该变量时,策略保持不变。切勿建议用户为其不控制的主机设置该变量。请参阅 SECURITY.md。
错误处理
| 场景 | 操作 |
|---|---|
| URL 无法访问 | 报告连接错误及状态代码。建议验证 URL、检查 DNS 解析,并确认网站可公开访问。 |
| 未找到 robots.txt | 说明根域名下未检测到 robots.txt。建议创建一个并设置适当的指令。继续审计其余类别。 |
| 未配置 HTTPS | 标记为严重问题。报告 HTTP 是否未重定向就直接提供服务、是否存在混合内容,或 SSL 证书是否缺失/过期。 |
| Core Web Vitals 数据不可用 | 说明 CrUX 数据不可用(低流量网站较常见)。建议使用 Lighthouse 实验室数据作为替代,并建议增加流量后重新测试。 |