og:title、og:description、og:image 三标签必须全写且满足硬性约束:标题≤60字符、描述≤200字符、图片为HTTPS绝对URL且≥1200×630px;须静态置于服务端返回的<head>中,动态注入无效;各平台解析逻辑不同,需按微信、微博、Twitter等分别适配。
不写或只写其中一两个,社交平台会降级抓取 <title>、<meta name="description"> 或页面第一张 <img>,结果常是标题被截断、描述为空、图片模糊或拉伸。微信尤其严格——它基本不 fallback,没 og:image 就不显示图;没 og:title 就用域名代替。
这三个值不是“写了就行”,得满足硬性约束:
og:title 建议 ≤ 60 字符;含未转义的 & 会被微信截断,得写成 &
og:description 建议 ≤ 200 字符;不能全是空格或换行符,否则被直接忽略og:image 必须是 HTTPS 绝对 URL(如 https://example.com/img/cover.jpg);尺寸建议 ≥ 1200×630 px;格式优先 .jpg 或 .png;HTTP 图片在 HTTPS 页面中会被微信屏蔽React/Vue 动态注入、document.createElement('meta')、或者塞在 <body> 里,社交平台爬虫都看不到。Facebook 的 facebookexternalhit、微信的 UA、LinkedIn 爬虫,全部只解析原始 HTML 的 <head>,且不执行 JS。
常见错误场景:
立即学习“前端免费学习笔记(深入)”;
useHead 但没走 SSR,生成的是空字符串/post/123 分享出来还是“首页”content 属性为空验证方式很简单:用 curl https://yoursite.com/post/123 或直接「查看网页源代码」,搜索 og:title,确认它真实出现在 <head> 里,且 content 有值。
写了 <meta property="og:image" content="https://xxx.jpg"> 却没图?先别改 HTML,排查这几点:
Content-Type: image/jpeg 或 image/png
facebookexternalhit)localhost 或内网地址必然失败调试工具比猜更有用:Facebook Sharing Debugger 会明确告诉你图片是否可访问、响应头是否合规;微信可用「公众号网页调试」或让朋友长按链接→浮窗→再点开,看预览图是否加载成功。
一套 OG 标签打天下?不行。各平台读取逻辑和兜底策略完全不同:
og:title、og:description、og:image,其他如 og:url 几乎无效;强制要求 og:image 是 HTTPS 绝对路径;不读 twitter: 前缀weibo:card、weibo:title 等自有 meta,OG 是备选;若 fallback 到 OG,描述会被硬截成 140 字以内<meta name="twitter:card" content="summary_large_image"> 等 twitter: 标签,否则无图甚至只显示链接最常被忽略的一点:动态页面(如文章详情、商品页)的 OG 数据必须随请求实时生成,不能共用一套静态值。服务端得根据路由参数查数据库或 CMS,拼出对应内容——这不是前端能补救的事。