RSS / OG URL 仍是占位域名

从 starter 模板起步,RSS 条目与 og:url 仍写 `https://example.com/...`——为什么这些是默默的 SEO 杀手。

你几个月前用 Astro / Next.js / Hugo starter 模板上线了一个站。站工作。然后有人在 Slack 分享你的文章,链接展开有标题…但 URL 预览写 example.com。或者 RSS 阅读器显示你的文章但点进去的链接是字面的 https://your-domain.com/article(占位字符串)。bug:starter 模板自带占位 URL(example.comlocalhostyour-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.xmlrss.xml、样本页;断言所有 URL = canonical。
  • 用 starter 模板时,克隆后立即审 example.com
  • 用一个 site URL 常量,所有模板引用它。
  • 不要在模板字面量里硬编码 URL;总从配置取。

FAQ

  • 搜索引擎会因 RSS 错误惩罚吗? 不直接,但破坏发现流和外链表面。
  • Canonical 必须是绝对 URL 吗? 是——canonical、sitemap、RSS、OG、JSON-LD 都用绝对 https URL。

相关阅读

标签: #域名 #DNS #SSL #排查 #占位 URL