技术 SEO 的问题有个共同特点:它们不报错。页面照样打开,用户看不出区别,但爬虫读不懂或读不到。下面 12 项都能在命令行或浏览器里直接验证。

基础可达性

1. HTTP 状态码是否正确

1
2
3
4
5
6
7
8
# 首页应为 200
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

# 不存在的页面应为 404(不能是 200)
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/no-such-page

# 旧域名/旧路径应为 301
curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}\n" https://example.com/old-path/

最常见的坑是 SPA 把 404 也返回 200,导致搜索引擎把无穷多个 URL 当作有效页面。

2. 跟随重定向链,确认没有多跳

1
curl -sIL https://example.com/ | grep -iE "^(HTTP|location)"

理想情况最多一跳(http → https非 www → www)。出现三跳以上会损耗权重,也可能被爬虫中途放弃。

3. HTTPS 证书链完整

1
2
curl -sI https://example.com/ | head -1
# 不应该有证书错误

如果中间证书没配全,部分客户端(尤其移动端和爬虫)会握手失败。

可抓取性

4. robots.txt 内容正确

1
curl -s https://example.com/robots.txt

必须包含 sitemap 地址,且不能有 Disallow: /。另外确认没有意外挡住 CSS/JS 文件——Google 需要它们来渲染页面。

5. 关键资源不被 noindex 挡住

CSS 和 JS 文件不需要被索引,但如果被 Disallow,Google 渲染页面时拿不到样式,可能误判移动端可用性。

6. 检查是否有无限参数 URL

在页面上随便点几下筛选、排序、分页,看 URL 是否无限生成组合。常见来源:

  • 排序参数(?sort=price&order=asc
  • 筛选参数(?color=red&size=l
  • 会话 ID(?sid=...
  • 站内搜索(?q=...

处理方式:这些页面加 noindex, follow,或用 robots.txt 挡掉参数模式,或在 Google Search Console 里配置 URL 参数规则。

内容可读性

7. canonical 是否自指且唯一

1
curl -s https://example.com/some-page/ | grep -i 'rel="canonical"'

判定标准:

  • 每页恰好一个 canonical
  • 指向的是该页自己的规范 URL(自指)
  • 不能全站都指向首页(这是严重的自伤)

8. hreflang 配置(多语言站)

多语言站如果只靠 JS 或 IP 判断语言,Google 可能只收录一个版本。正确做法是每个语言版本互相声明:

1
2
3
<link rel="alternate" hreflang="en" href="https://example.com/en/">
<link rel="alternate" hreflang="zh" href="https://example.com/zh/">
<link rel="alternate" hreflang="x-default" href="https://example.com/">

9. 标题层级是否合理

一页只应有一个 <h1><h2> 不要跳级到 <h4>。用浏览器控制台快速查:

1
2
// 在 Console 里跑
[...document.querySelectorAll('h1,h2,h3,h4,h5,h6')].map(h => h.tagName + ' ' + h.textContent.trim().slice(0, 30))

10. 图片是否有宽高与 alt

1
2
3
4
// 在 Console 里跑,列出缺 alt 或宽高的图片
[...document.querySelectorAll('img')]
.filter(i => !i.alt || !i.width || !i.height)
.map(i => i.src)

缺宽高会导致布局跳动(CLS 变差),缺 alt 会让图片搜索无从索引。

结构化数据

11. JSON-LD 语法必须有效

用 Google 的 Rich Results Test 或 Schema Markup Validator 跑一遍。常见错误:

  • 尾随逗号
  • 中文引号被当成 JSON 引号
  • 字段名拼错(datePublish 而非 datePublished
  • 缺少必填字段

一个语法错误会让整块结构化数据失效,而且页面上看不出任何异常。

12. 社交分享卡片是否正常

1
curl -s https://example.com/ | grep -iE 'og:(title|description|image|url)'

检查 og:image 的 URL 能否直接打开、尺寸是否为 1200×630 的 PNG/JPG。

注意一个常见坑:有些主题会在配置里统一设置 OG 图,结果把每篇文章自己的封面覆盖掉了。检查方法是对比首页和文章页的 og:image 是否不同。

附:一次跑完的脚本

把上面几项拼成一个脚本,季度体检时直接跑:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
DOMAIN="${1:?用法: ./tech-seo-check.sh https://example.com}"
echo "== 首页状态 ==" && curl -s -o /dev/null -w "%{http_code}\n" "$DOMAIN/"
echo "== 404 状态 ==" && curl -s -o /dev/null -w "%{http_code}\n" "$DOMAIN/no-such-page-xyz"
echo "== 重定向链 ==" && curl -sIL "$DOMAIN/" | grep -iE "^(HTTP|location)"
echo "== robots.txt ==" && curl -s "$DOMAIN/robots.txt"
echo "== canonical ==" && curl -s "$DOMAIN/" | grep -io '<link rel="canonical"[^>]*>'
echo "== OG 标签 ==" && curl -s "$DOMAIN/" | grep -iE 'og:(title|image|url)'
echo "== sitemap 条目 ==" && curl -s "$DOMAIN/sitemap.xml" | grep -c "<loc>"

优先级建议

如果一次只能修三样,按这个顺序:

  1. 状态码(404 返回 200 的危害最大)
  2. canonical(全站指向首页是灾难级错误)
  3. 薄内容页的 noindex(释放抓取预算)

剩下的按影响面排。核心原则是:先保证爬虫能正确理解你的站,再谈内容质量