og url 和 canonical 在 27 个首页上:18 个两处都写,差异只有一个末尾斜杠

og url 和 canonical 都在回答同一个问题:这一页该以哪个网址被认识。27 个首页里 18 个两处都写了,18 对全部一致 —— 仅有的三处差异只是一个末尾斜杠。

抓取与收录5 分钟读完2705 次阅读
og url 和 canonical 在 27 个首页上:18 个两处都写,差异只有一个末尾斜杠

实测 · 2026-09-20 · 27 个首页 · 单次抓取

样本与口径:还是这一系列用了很久的那 30 个域,2026-09-20 每个首页请求一次,桌面 Chrome UA、跟随跳转、不执行 JavaScript。medium.com 与 stackoverflow.com 返回 Cloudflare 挑战页、nytimes.com 只回了 6 KB 的桩页,三者剔除,纳入 27 个。下面每个值都是从落盘 HTML 里读出来的。

og url 和 canonical 都在回答同一个问题:这一页该以哪个网址被认识。27 个首页里,20 个写了 og:url、22 个写了 canonical,其中 18 个两处都写,而且这 18 对全部指向同一个网址。18 对里有 3 对存在差异,差异只有一个末尾斜杠。这是一份「一致性」结果,不是一份找错清单。

怎么测的

每个首页请求一次,把返回的 HTML 存下来,在 head 里找两处声明:一个 <link rel="canonical"> 和一个 <meta property="og:url">。先记下两边的原始值,再在去掉协议、开头的 www. 和末尾斜杠之后做比较。下面这条命令在任意页面上做的是同一件事。

curl -s -L --compressed -A "Mozilla/5.0" https://example.com/ -o page.html

python3 -c "
import re
html = open('page.html').read()
head = html.split('</head>')[0]
for pat in (r'<link[^>]+rel=[\"\\']?canonical[^>]*>', r'<meta[^>]+property=[\"\\']?og:url[^>]*>'):
    for m in re.finditer(pat, head, re.I):
        print(re.sub(r'\s+', ' ', m.group(0)))
"

这个方法里带着两条限制。它读的是声明不是行为:从站外看不出两处声明若真的冲突时,站点会选哪一个。它比的又是字符串,所以一个末尾斜杠的差异,在归一化之前也算一处差异。

og url 和 canonical 各是给谁看的

两者来自两个不同的体系,只部分重叠。canonical 是搜索信号,Google 把它定义为「告诉搜索引擎你希望哪个网址出现在结果里」的一种方式。og:url 是社交信号,Open Graph 协议把它定义为「作为这个对象在图谱里永久 ID 的那个网址」。

Google 那页把几种 canonical 方法按影响力强弱排了序:先是重定向,然后是 rel="canonical",最后才是 sitemap 收录。它还明说,不声明偏好网址的站点通常也没什么问题。og:url 根本不在那张表里,因为它不是搜索信号。

canonical 是你说给搜索引擎听的,og url 是你说给其他所有人听的。两者指的是同一个网址时,你才只有一个页面。

27 个首页各自写了什么

覆盖率并不齐,而且这两处声明不是一起做的决定。4 个站写了 canonical 却没写 og:url,2 个站写了 og:url 却没写 canonical,3 个站两处都没有。下表就是整个面板。

站点canonicalog url一致
framer.comhttps://www.framer.com/https://www.framer.com/
discord.comhttps://discord.com
arstechnica.comhttps://arstechnica.com/https://arstechnica.com/
railway.comhttps://railway.comhttps://railway.com
wired.comhttps://www.wired.com/https://www.wired.com/
bbc.comhttps://www.bbc.comhttps://www.bbc.com
notion.comhttps://www.notion.com/https://www.notion.com/
ycombinator.comhttps://www.ycombinator.com/
slack.comhttps://slack.comhttps://slack.com
supabase.comhttps://supabase.comhttps://supabase.com/斜杠
theverge.comhttps://www.theverge.comhttps://www.theverge.com/斜杠
substack.comhttps://substack.com/https://substack.com/
mozilla.orghttps://www.mozilla.org/en-US/
techcrunch.comhttps://techcrunch.com/https://techcrunch.com/
nextjs.orghttps://nextjs.orghttps://nextjs.org
vercel.comhttps://vercel.comhttps://vercel.com
shopify.comhttps://www.shopify.com/https://www.shopify.com/
github.comhttps://github.comhttps://github.com/斜杠
netlify.comhttps://www.netlify.com/
cloudflare.comhttps://www.cloudflare.com/https://www.cloudflare.com/
figma.comhttps://www.figma.com/https://www.figma.com/
stripe.comhttps://stripe.com/nlhttps://stripe.com/nl
webflow.comhttps://webflow.com/
linear.apphttps://linear.app
reddit.com
wikipedia.org
canva.com

那 3 处差异,为什么只是一个斜杠

有 3 个站把同一个主机名和路径写了两遍,只差末尾斜杠:supabase.com、theverge.com、github.com 都是 canonical 不带斜杠、og:url 带斜杠。其余每一对都逐字节相同。面板上没有任何一处把两个声明指向了真正不同的网址。

有两行值得多看一眼,而且都不是错。mozilla.org 是唯一一个 og:url 离开首页的:它指向 /en-US/ 这个语种路径,而对 mozilla.org 的请求最终落在裸主机名上。stripe.com 因为本机出口 IP 在荷兰,由 /nl 应答,两处声明都跟着这个区域网址走 —— canonical 跟的是「实际服务的那一页」,不是那个中立国家的版本。

你自己的页面该怎么办

要做的不是把两个标签到处都加上,而是检查已经有的那两处,是不是指向同一个网址,并且分清搜索引擎读的是哪一个。

  1. 跑上面那条命令,把一页上的 canonical 和 og:url 两个值列出来。
  2. 两边用同一种方式归一化:去掉协议、开头的 www. 和末尾斜杠。
  3. 如果差异超过这些,就定下哪一个是真正的网址,改掉另一个。末尾斜杠是外观问题,不同的路径不是。
  4. 记住哪个信号是给谁的。canonical 是 Google 有文档的那一个;og:url 是给社交平台和聊天预览用的,不带搜索权重。
  • 让 og:url 和 canonical 指向同一个网址,主机名也要一样。
  • 别以为有了 canonical,og:url 就多余,反过来也一样。它们由不同的消费者读取。

有一条边界要说明白。我们读的是页面上的声明、比的是字符串。我们没测过搜索引擎或社交平台会怎么处理末尾斜杠的差异,也说不准那 3 个有差异的站是否因此吃了亏。能说的更窄、但也够用:在这 27 个首页上,两处声明从来没有指向过不同的页面。

常见问题

你们是怎么测的?

2026-09-20 每个首页请求一次,桌面 Chrome UA、不执行 JavaScript、跟随跳转,返回体按字节落盘。在 head 里找 canonical 链接和 og:url 这个 meta 标签,记下原始值,再在去掉协议、开头的 www. 和末尾斜杠之后比较。请求的 30 个站里有 3 个返回挑战页或不足 10 KB 的桩页,剔除后剩 27 个。

Google 读的是哪一个?

canonical。Google 把 rel="canonical" 写进了「表示偏好网址」的几种方法里,也列进了影响规范化的一组方法。og:url 在那份文档里根本没被提到,因为它是给社交分享用的 Open Graph 属性,不是搜索信号。

两个都要写吗?

不一定。Google 明说,不声明偏好网址的站点通常也没什么问题;这个面板上就有好几个站只写了其中一个。如果你会把页面分享到社交平台或聊天软件,那 og:url 才是那些消费者读的;如果只关心搜索,起作用的是 canonical。

少了末尾斜杠算问题吗?

这份数据回答不了。有差异的那 3 个站只差一个末尾斜杠,而且两种写法各自都能打开同一页。把它当成一致性问题而不是 bug:选一种写法,两个标签里都用它。

这次没测什么?

行为,以及爬虫拿到这些值之后会做什么。我们没测搜索引擎或社交平台如何解析末尾斜杠的差异,也没逐条请求确认两个标签里的网址和声明它的页面返回的是不是同一份内容。这篇讲的是 head 里写了什么,仅此而已。

多少个首页声明了 canonical、多少个声明了 og,数字分别在 canonical 实测open graph 实测里。想看一个不渲染的客户端从同一个 head 里拿到什么,AI 爬虫可达性检查器回答的是那个问题。

og url 和 canonical 在 27 个首页上:18 个两处都写,差异只有一个末尾斜杠