微信分享卡片实现复盘:OG 配置、Cloudflare 放行与缓存策略
这篇文章沉淀本次「微信分享链接不出卡片」问题的完整落地方案,目标是让后续同类问题可以快速定位、快速恢复。
1. 问题现象与结论
1.1 现象
- Telegram 可正常出卡片;
- 微信里仅显示冷链接(纯 URL 文本);
- 同一链接有时稍后恢复,表现不稳定。
1.2 最终结论
这类问题通常不是单点原因,而是三件事叠加:
- 页面
og:image链接必须真实可访问且 HTTPS; - 微信抓取流量不能被 Cloudflare 挑战/拦截;
- 微信有缓存,修复后不会立刻对旧链接生效。
2. 采用的实现方案
2.1 元标签策略
采用标准 OG 协议作为主方案,每个页面保证最小必备项:
og:typeog:titleog:descriptionog:imageog:url<title>
并补充增强项(非必须,但实测更稳定):
og:image:secure_urlog:image:typeog:image:widthog:image:heighttwitter:*对应字段canonical
2.2 Cloudflare 策略
在 WAF Custom Rule 中对微信 UA 使用 Skip:
- 匹配条件:
Hostname = notes.wuying3052.cn且User-Agent contains MicroMessenger(可补WeChat) - 跳过组件:Managed Rules、Super Bot Fight Mode、BIC、Rate Limiting 等
2.3 缓存策略
修复后验证必须使用新 URL(如 ?v=20260210x)触发微信重新抓取。
3. 核心文件与职责
3.1 全局站点配置
文件:src/lib/config/site.ts
职责:统一站点 URL、OG 图片、图片类型和尺寸,避免各页面硬编码不一致。
ts
export const SITE_CONFIG = {
name: 'WY NOTES',
title: 'WY NOTES - 技术与学习笔记',
description: '记录学习过程,分享技术笔记。',
url: SITE_URL,
ogImage: `${SITE_URL}/og-image.jpg`,
ogImageType: 'image/jpeg',
ogImageWidth: '800',
ogImageHeight: '800',
locale: 'zh_CN'
} as const; 3.2 页面级 svelte:head
核心页面(首页、资源页、文章列表、文章详情、项目页、项目详情)都在各自 +page.svelte 内维护独立 OG,保证 SSR 输出直接可抓取。
典型结构:
svelte
<svelte:head>
<title>{pageTitle}</title>
<link rel="canonical" href={pageUrl} />
<meta name="description" content={pageDescription} />
<meta property="og:type" content="website" />
<meta property="og:url" content={pageUrl} />
<meta property="og:title" content={pageTitle} />
<meta property="og:description" content={pageDescription} />
<meta property="og:image" content={ogImage} />
<meta property="og:image:secure_url" content={ogImage} />
<meta property="og:image:type" content={SITE_CONFIG.ogImageType} />
<meta property="og:image:width" content={SITE_CONFIG.ogImageWidth} />
<meta property="og:image:height" content={SITE_CONFIG.ogImageHeight} />
</svelte:head> 4. 本次修复中的关键点
4.1 修正错误图片路径
最初存在部分页面使用了不存在的 og-image.png,已统一改为可访问的 og-image.jpg 或 SITE_CONFIG.ogImage。
4.2 去掉冲突风险
布局层仅保留全局基础标签(如 og:site_name、og:locale),避免页面层与布局层输出冲突的 og:title/og:image。
4.3 保证微信抓取可达
Cloudflare 自定义规则对微信 UA 执行 Skip,避免挑战流程阻断爬虫抓取。
5. 线上排查清单(实战版)
按优先级从快到慢排查:
curl或浏览器直接访问页面源码,确认 OG 已在 SSR HTML 中;- 访问
og:image,确认200、HTTPS、无鉴权; - Cloudflare Security Rules 确认微信 UA 命中放行规则;
- 新链接参数重试(微信缓存);
- 若仍失败,再检查 DNS/线路与微信侧策略。
6. 经验总结
- OG 标签正确只是前提,不是全部;
- 微信分享问题经常是「标签 + 安全策略 + 缓存」组合问题;
- 统一
SITE_CONFIG与页面 head 模板,能显著降低回归概率; - 把 Cloudflare 放行规则固定化,是长期稳定的关键。
7. 可复用模板(建议)
后续新增页面时,至少复用以下字段:
titledescriptioncanonicalog:typeog:urlog:titleog:descriptionog:image
再按需补 og:image:* 与 twitter:* 即可。
