我把一个站的 SEO 从头修了一遍,发现真正影响收录的,不是文章写得好不好,是这四样东西有没有配对。

它们各管一件事:

项目管什么
TDK告诉搜索引擎"这页讲什么"
canonical告诉搜索引擎"哪个地址才是正版"
sitemap告诉搜索引擎"我有哪些页面"
JSON-LD告诉搜索引擎"这是什么类型的内容"

任何一样错位,前面几样就白做。

这篇把四样讲透,附可直接抄的代码。

一、TDK:最老也最基础

TDK 是 Title、Description、Keywords。

Title 标题

<title>为什么我花半个月折腾 E5-2696V3:老服务器 U 不能当主力机 | 陌笑技术分享</title>

规则:

Description 描述

<meta name="description" content="折腾 10 天 E5-2696V3 的完整记录:从 BIOS 掉盘、降压补丁到 64G 内存跑 AI 仍 OOM 的真实原因,以及为什么老服务器不适合当日常主力机。">

规则:

我之前所有文章共用一句模板描述,等于没写。现在改成取正文前 140 字,去掉 markdown 符号。

Keywords 关键词

<meta name="keywords" content="E5-2696V3,E5洋垃圾,老服务器,X99主板,服务器功耗">

规则:

百度官方说 keywords 权重很低,但它仍然是页面主题信号之一。新站尤其要写。

二、canonical:解决"同一份内容多个地址"

这个是最容易出大事的。

一个页面可能有多个地址:

对搜索引擎来说,这是四个页面,内容一样。结果就是权重分散,谁也不收录。

canonical 就是告诉它"这四个里,只有第三个是正版":

<link rel="canonical" href="https://www.example.com/post/1">

关键是一致性:

这四个必须是同一个。

我之前的坑就在这儿:canonical 写不带 www,sitemap 和推送用带 www。百度就懵了。

修完统一之后,索引量才开始动。

顺便:其他版本要 301

光写 canonical 不够,最好把其他版本 301 到正版:

server {
    listen 80;
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate ...;
    return 301 https://www.example.com$request_uri;
}

canonical 是"建议",301 是"强制"。两个都做,搜索引擎才没有歧义。

三、sitemap:一份页面清单

sitemap.xml 放在站点根目录,列出所有页面和最后修改时间:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://www.example.com/</loc>
    <lastmod>2026-11-04</lastmod>
    <changefreq>daily</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://www.example.com/post/47-xin-zhan.html</loc>
    <lastmod>2026-11-03</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

规则:

配套 robots.txt 指向它:

User-agent: *
Allow: /
Sitemap: https://www.example.com/sitemap.xml

sitemap 常见错误:

四、JSON-LD:结构化数据

前面三样是"基础信息",JSON-LD 是"语义增强"——告诉搜索引擎这是一篇文章、一个教程、还是一个问答。

文章页的标准写法:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "为什么我花半个月折腾 E5-2696V3",
  "description": "折腾 10 天的完整记录,包括 BIOS 掉盘、降压补丁和内存溢出。",
  "image": "https://www.example.com/assets/01-cover.jpg",
  "datePublished": "2026-10-15T08:00:00+08:00",
  "dateModified": "2026-10-18T10:00:00+08:00",
  "author": {
    "@type": "Person",
    "name": "陌笑技术分享",
    "url": "https://www.example.com"
  },
  "publisher": {
    "@type": "Organization",
    "name": "陌笑技术分享"
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://www.example.com/post/01-e5.html"
  }
}
</script>

必填的三项:headline、datePublished、author。

有 image 的话,在某些搜索场景会显示缩略图。

验证方法:

  1. 打开 Google 的 Rich Results Test(需要梯子)
  2. 国内可以用百度搜索资源平台的"结构化数据"工具
  3. 或者自己跑一遍解析:
import json, re
html = open('page.html').read()
m = re.search(r'<script type="application/ld\+json">(.*?)</script>', html, re.S)
obj = json.loads(m.group(1))
print(obj['headline'])

最容易出错的地方:中文引号。

标题里有《》或者"",直接拼进 JSON 就会坏。必须用 json.dumps 生成,别手拼字符串。

这个我单独写了一篇,因为它让我整个结构化数据白做了半个月。

五、四件套的一致性检查表

上线前对着这张表过一遍:

检查项要求
每页 Title 唯一是
每页 Description 唯一,概括内容是
Keywords 按篇定制是
canonical 每页唯一且是完整 URL是
canonical 与 sitemap 地址一致是
canonical 与主动推送地址一致是
非正版地址 301 到正版是
sitemap 只列真实存在的页面是
sitemap lastmod 是真实更新时间是
robots.txt 指向 sitemap是
JSON-LD 能通过 json.loads是
JSON-LD 的 URL 与 canonical 一致是

十二项全过,地基才算稳。

六、四个之外还有一件事

配置是地基,内容是房子。

我见过配置做得完美、内容全是采集的站,一样不收。

反过来说,配置有瑕疵但内容扎实的站,早晚会被收,只是慢一点。

所以这四件套的作用是"不拖后腿",不是"送上门"。

最后

我把这套东西修完,最直观的变化是:百度站长平台的索引量从 1 开始动了。

不快,但在涨。

下一篇讲 JSON-LD 那个坑——一个中文引号怎么让结构化数据全废,以及我是怎么查出来的。

如果你也在折腾这套东西,碰到卡住的地方,可以加我微信 lige0552 聊聊。白天要上班,消息回得慢,看到都会回。