你几个月前用 Astro / Next.js / Hugo starter 模板上线了一个站。站工作。然后有人在 Slack 分享你的文章,链接展开有标题…但 URL 预览写 example.com。或者 RSS 阅读器显示你的文章但点进去的链接是字面的 https://your-domain.com/article(占位字符串)。bug:starter 模板自带占位 URL(example.com、localhost、your-domain)烤进了 config,你从来没替换。这种问题悄悄潜伏,因为多数用户流程忽略 RSS/OG,但对聚合器、RSS 读者、社交预览来说彻底坏了。
常见原因
按命中率从高到低。
1. starter 模板默认从未更新
// site.config.mjs(Astro starter 默认)
export const SITE = {
url: 'https://example.com', // ← 从未更新
};
你上线了模板但没替换 example.com。
怎么判断:
grep -rn "example.com\|your-domain\|localhost:[0-9]" src/
src/ 里任何匹配都可能影响生产。
2. OG 生成用字面占位
<meta property="og:url" content={`https://example.com${article.slug}`} />
模板本意是让你改的占位,但原样上线了。
怎么判断:随便一页 view source 搜 og:url。应是你真实域名。
3. 生产环境缺 SITE_URL env var
const url = process.env.SITE_URL || 'https://example.com';
生产没设 SITE_URL,fallback 触发。
怎么判断:平台控制台 → env vars → 看生产环境有没有设 SITE_URL。
4. RSS 模板用了旧 URL 字段
rss.xml.js:
return rss({
site: 'https://your-domain.com', // ← 占位
// ...
});
5. sitemap 对了但 RSS / OG 没对
代码库不同部分用了不同可信源。你改了 sitemap 那里,但漏了 RSS 或 OG。
怎么判断:curl yourdomain.com/sitemap.xml 显示你的域名,但 curl yourdomain.com/rss.xml 显示占位。
6. 生成的 OG 图片 URL 有占位
静态 OG 图在 https://your-domain.com/og.png,meta 标签里引用。域名是占位的话,社交平台拉不到图。
最短修复路径
第 1 步:找所有占位 URL
grep -rn "example\.com\|your-domain\|localhost:[0-9]\|<YOUR_DOMAIN>" src/ public/ astro.config.mjs site.config.mjs
列出每个匹配。每个都要更新或删除。
第 2 步:替换成 canonical URL
不要无脑 find/replace;理解每个上下文:
site.config.mjs SITE.url→ canonical 站 URL- RSS 模板
site→ canonical 站 URL - OG 生成 → 从 SITE_URL 或常量推导
- Meta 标签模板 → 用
${SITE.url}/${path}
单一可信源。处处引用它。
第 3 步:生产设 env var
# Vercel
vercel env add SITE_URL production
# 输入:https://yourdomain.com
# Netlify(控制台)
# Site settings → Environment variables → 加 SITE_URL
用平台预览部署验证值被读到了。
第 4 步:重构建并验证
npm run build
curl http://localhost:4321/rss.xml | head -20
curl http://localhost:4321/ | grep -E "og:|canonical"
应该全用 canonical URL。
第 5 步:生产验证
curl https://yourdomain.com/rss.xml | head -20
curl https://yourdomain.com/ | grep -E "og:url|canonical"
第 6 步:强制刷新第三方缓存
- Facebook / LinkedIn / Slack:URL 粘进各自 debugger(Facebook Sharing Debugger、LinkedIn Post Inspector)→ “Scrape again”。
- RSS 聚合器(Feedly 等):下次拉取时会更新。
第 7 步:CI 加校验
# 构建后
if grep -E "example\.com|localhost:[0-9]" dist/ -r; then
echo "ERROR: placeholder URL in build output"
exit 1
fi
哪些情况可能不是你操作错了
一些集成缓存 OG / RSS 几天。修了源头后,第三方预览可能还要几天才刷新——手动在 debugger 里触发刷新。
容易误判的情况
以为”没人读 RSS 了”——聚合器(Slack 链接展开、Discord、RSS reader、爬取的 AI 助手)仍解析。错的 RSS = 错的链接四处传播。
预防建议
- 把 SITE_URL 设为必填 env var、无默认 fallback。缺失就构建失败。
- CI 测试抓
sitemap.xml、rss.xml、样本页;断言所有 URL = canonical。 - 用 starter 模板时,克隆后立即审
example.com。 - 用一个 site URL 常量,所有模板引用它。
- 不要在模板字面量里硬编码 URL;总从配置取。
FAQ
- 搜索引擎会因 RSS 错误惩罚吗? 不直接,但破坏发现流和外链表面。
- Canonical 必须是绝对 URL 吗? 是——canonical、sitemap、RSS、OG、JSON-LD 都用绝对 https URL。