seo url 怎么起:官方六条规则,和一条把 sitemap 全跑一遍的命令
seo url 的合格线是:能读懂的单词、连字符、参数尽量少、大小写只有一种。Google 把这写成抓取的前提条件,本篇给六条原话加一条能直接粘的自查命令。

一个合格的 seo url 长这样:能读懂的单词、词之间用连字符、参数尽量少、大小写只有一种。这不是审美偏好,Google 把它写成抓取的前提条件 —— 那页开门见山要求你 "use a crawlable URL structure",并且写明地址不符合这些条件时,"Google Search will likely crawl your site inefficiently — including but not limited to extremely high crawl rates, or not at all"。
开始之前
这一篇讲的是还没建出来的页面、或者你正要新开的一个栏目,地址该怎么起。已经在排名的页面改地址是另一件事,代价清单在 301 跳转之外 那篇里。如果你手上已经有两个地址指着同一个页面、要挑一个留下,那是 canonical 标签怎么写,不是这一篇。
seo url 的六条规则,官方原话
六条,每一条都短到可以用眼睛核。下面右列是 Google 的原话,本日抓取。
| 规则 | 官方原话 |
|---|---|
| 用词不用 ID | "Use readable words rather than long ID numbers in your URLs." |
| 用读者的语言 | "Use words in your audience's language in the URL" |
| 连字符 | "using hyphens (-) instead of underscores (_)" |
| 编码 | "non-ASCII range should be percent encoded" |
| 参数 | "trimming unnecessary parameters" |
| 大小写 | "URLs are case sensitive" |
连字符那条后面跟着理由,值得一起记住,因为它解释了整张表:官方说用连字符是因为它 "helps users and search engines better identify concepts in the URL"。地址是页面上唯一在页面加载之前就被读到的东西 —— 人先读它,机器也先读它。
网址是你这一页里唯一在页面打开之前就被读过的部分。
中文站到底能不能用中文做地址
能,而且官方那条「用读者的语言」本来就包含这种情况。但要接受它长什么样:非 ASCII 字符必须做百分号编码,所以浏览器地址栏里显示成中文的那个地址,写进 sitemap、写进内链、贴进日志之后,是一串 %E4%B8%AD%E6%96%87。看着吓人,它是合规的,不是错误。
真正要判的不是它丑不丑,是这批读者在哪一侧。站是给海外用户看的,那目标语言就是英文,地址就该是英文词 —— 官方那条说的是「你的读者的语言」,不是「你自己的语言」。做出海站却把中文塞进地址,是把这条规则用反了方向。
顺带说一句常被忽略的:六条规则底下还压着一句最少被引用的要求 —— 遵循 IETF STD 66,也就是定义 URI 长什么样的那份标准。上面六条里大部分是这份标准的白话版。知道这一点的意义在于知道权威从哪儿来:它们不是搜索引擎自己发明的偏好,而是地址本来就被规定成的样子,一个违反它的路由,会在和搜索毫无关系的地方先坏掉。
真正造成损失的是参数
Google 点名了三类,每一类都把一个页面变成很多个地址:追踪参数,比如 ?click=6EE2BF1AF6A3D705D5561B7C3564D9C2;商品排序参数,比如 ?search_sort=relevance;还有 session ID,官方给的替代方案很直接 —— 改用 cookie。
另外两种形态也被点名要避开。写坏的相对链接会生成一个没有边界的地址集合,没有终止日期的日历页会主动做同一件事,官方对日历那种情况给的做法是给指向未来日期的链接加 nofollow。这两种都在给爬虫制造工作量,而这些工作量不产生任何回报。
还有一条是关于内容怎么切换的:"Don't use URL fragments to change content"。# 后面那一段根本不会发给服务器,所以靠改锚点换内容的页面,是很多个状态共用一个地址。官方给的替代方案是 History API。
新开一个栏目的五步
做一次二十分钟,之后它是模板层的决定,不再是每篇文章的决定。
- 先写地址,再写页面。如果一个页面没法用三四个连字符单词说清楚,说明它讲了不止一件事 —— 地址在替你指出这一点。
- 定死一种大小写,用小写,并且在路由层强制。官方明写地址区分大小写,也就是说在你做出决定之前,
/Handbook和/handbook是两个页面。 - 把「哪些参数允许改变访客看到的内容」列出来。除此之外的追踪、排序、会话参数,要么不进地址,要么不产生一个可被收录的独立页面。
- 多地区形态现在就定。官方列的是国家域名
example.de和国家子目录example.com/de/,两种都在列,但以后换一种等于把所有地址搬一遍。 - 用下面那条命令跑一遍 sitemap,在这个栏目还没有任何外部链接指进来之前,先把打印出来的问题改掉。
交付物:把 sitemap 里所有地址跑一遍
一条命令。它只打印有问题的地址,所以没有输出就是干净的。
curl -s https://example.com/sitemap.xml \
| grep -o '<loc>[^<]*</loc>' | sed 's/<[^>]*>//g' \
| python3 -c '
import sys, urllib.parse
for line in sys.stdin:
u = line.strip()
p = urllib.parse.urlparse(u)
bad = []
if "_" in p.path: bad.append("下划线")
if p.path != p.path.lower(): bad.append("有大写")
if p.query: bad.append("带参数")
if p.fragment: bad.append("带锚点")
if any(ord(c) > 127 for c in u): bad.append("未编码非 ASCII")
if len(u) > 115: bad.append("长度 %d" % len(u))
if bad: print(u, "|", ", ".join(bad))
'
其中 115 这个长度阈值是我们定的,不是 Google 的 —— 官方文档没给任何长度上限,115 只是一个地址在搜索结果和 AI 引用里开始被截断的位置。这一列当成「看一眼」的提示,不是失败项。
| 打印出什么 | 怎么处理 |
|---|---|
| 下划线 | 新页面改用连字符 |
| 有大写 | 跳转到小写那个地址 |
| 带参数 | 确认它真的改变内容 |
| 带锚点 | 从 sitemap 里去掉 |
| 非 ASCII | 做百分号编码 |
| 长度 | 看一眼,通常不动 |
三种以后要还的债
三种当时都觉得不花钱。
- 把日期放进地址。
/2024/03/how-to-x等于把页面的年龄公开写在地址上,更新过一次之后它看起来仍然是一篇老文,而唯一的补救办法是一次本来不必发生的搬迁。 - 为了整齐而改名。每改一次就要花掉跳转、内链,还有这一页攒下来的东西;地址变得「好看一点」几乎从来不值这个价。
- 让 CMS 替你决定。WordPress 默认那种带文章 ID 的地址,正是官方第一条点名要避开的形态,而且等站上有了几百个页面之后最难改。
seo url 管不到的地方
这套规则不会让页面排得更高。官方整页讲的都是抓取效率,文档里最强的一句话说的也是抓取行为,不是位置。地址起得再规范,页面本身取不到也是白搭 —— 爬虫到底能不能到你这儿,用 AI 爬虫可达性检查 单独跑一遍就知道。
还有一件事我们说不了:一个坏地址到底损失多少流量。这个数没有公开来源,你在别处见过的任何一个百分比都是编的。把地址做对的真实理由是它长期不变,而且创建那一刻是免费的,之后每一刻都要花钱。
常见问题
连字符和下划线真的有区别吗?
Google 明确推荐连字符,理由是它帮人和搜索引擎把地址里的概念分开。下划线不算错,只是更难读的那一种。
网址能有多长?
官方没有给上限。短地址的好处在于它在搜索结果和引用里能完整显示,这是可读性的理由,不是排名的理由。
做出海站,地址要用英文还是中文?
用你读者的语言。站是给海外用户看的就用英文词,官方那条说的是读者的语言,不是站长的语言。
地址区分大小写吗?
区分,官方要你注意这一点。只对外提供一种写法,另一种做跳转,否则一个页面就有了两个地址。
地址里到底能不能带参数?
能,按标准写法来:键和值之间用等号,多个参数之间用与号。留下会改变读者看到的内容的那些,其余去掉。
做多语言站,要买国家域名还是用子目录?
官方把国家域名和国家子目录并排列出来,两种都在文档里,所以不存在哪一种更「正确」。按你运维得起哪一种选:子目录是一套部署,一组国家域名是好几套。这个决定要在第一个本地化页面上线之前做完,因为两种形态之间换来换去的成本非常高。
本文属于 QueryWin 实操手册 · 第 2 阶


