Skip to content

由 Worker 托管 sitemap.xml 与 robots.txt(复用 RSS 的 R2 缓存 + cron 预生成架构),修复 RSS 站点地址并优化中文渲染 - #545

Merged
OXeu merged 9 commits into
openRin:mainfrom
hohouman:main
Aug 19, 2026

Conversation

@hohouman

@hohouman hohouman commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

本次提交包含若干相互独立但围绕 SEO、RSS 正确性与中文渲染的改进,其中 sitemap/robots 的落地方式与既有 RSS 保持一致、可维护性更好。

一、新增环境变量 FRONTEND_URL(重要)

本次新增一个可选环境变量 FRONTEND_URL,表示站点的公开访问地址(如 https://your-domain.com,需带协议、不带结尾斜杠)。

用于 sitemap.xml、robots.txt 以及 RSS 中生成绝对链接;
在 .env.example 与 server/src/custom-env.d.ts(全局 Env 接口新增 FRONTEND_URL?: string;)中声明;
未配置时自动回退到请求来源(request origin),因此为可选,不影响现有部署。
部署时建议显式配置 FRONTEND_URL,以保证搜索引擎与阅读器拿到正确的绝对地址。

二、由 Worker 托管 sitemap.xml 与 robots.txt(与 RSS 同架构)

此前站点缺少 sitemap,且 robots.txt 依赖前端静态文件。本次将其内联进 rin-server,并复用 RSS 既有的「R2/S3 缓存 + cron 预生成」机制,而非每次请求实时查库:

新增 server/src/services/sitemap.ts:
导出 SitemapService()(Hono 路由:GET /sitemap.xml、GET /robots.txt);
GET /sitemap.xml:基于现有 D1 / Drizzle 层,从已发布文章(draft = 0)、瞬间、友链、标签生成 sitemap,URL 对齐前端路由;
GET /robots.txt:固定内容,允许所有爬虫,屏蔽 /admin/、/profile/、/login/、/search/,并将 Sitemap: 指向 <FRONTEND_URL>/sitemap.xml;
两个路由均复用 RSS 的模式——请求时优先从 R2/S3 缓存读取,命中直接返回;未命中则实时生成、写回存储桶(S3_CACHE_FOLDER,默认 cache/)后再返回;未配置存储桶时优雅降级为实时生成;
导出 sitemapCrontab(env, db),与 rssCrontab 同构,供定时任务预生成。
在 server/src/runtime/scheduled-handler.ts 的 handleScheduled 中注册 sitemapCrontab(env, db),由 cron 预生成;
在 server/src/core/register-routes.ts 中通过 app.route("/", SitemapService()) 注册;
修改 server/src/runtime/fetch-handler.ts:在静态资源分支之前放行 /sitemap.xml 与 /robots.txt 元数据路由(原先带扩展名的请求会先进入静态资源分支,导致这两个路由失效);
删除 client/public/robots.txt,避免其覆盖由 Worker 返回的 robots.txt。

三、修复 RSS 缺失站点地址

server/src/services/rss.ts:
实时生成改为优先使用 env.FRONTEND_URL(回退到请求 origin);
修复 rssCrontab:定时任务自动生成并缓存到存储桶的 RSS,原先 frontendUrl 硬编码为空字符串,导致自动生成的订阅源缺少站点 URL;现改为使用 env.FRONTEND_URL。

四、中文字体渲染修复

当浏览器首选语言为 zh-TW / zh-HK 时,中文会出现有粗有细、有大有小的破碎现象。

client/index.html:增加预连接并加载 Noto Serif SC;
client/src/index.css:字体栈补充 "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", sans-serif 回退;
client/tailwind.config.ts:为 fontFamily.sans / fontFamily.serif 增加 CJK 回退。

image image

五、部署配置补充 新增的可选环境变量 FRONTEND_URL 需落到 Worker 运行时:

cli/src/tasks/deploy-cf.ts:生成 wrangler.toml 时将其写入 [vars];
.github/workflows/deploy.yml:部署步骤注入 FRONTEND_URL(读取仓库变量,默认空);
.github/actions/setup-wrangler/action.yml:CI 用 wrangler.toml 占位同步。 cron 调度无需调整,sitemapCrontab 已随既有 */20 * * * * 触发。

@hohouman
hohouman marked this pull request as draft August 1, 2026 08:05
@hohouman
hohouman marked this pull request as ready for review August 1, 2026 08:06
@OXeu

OXeu commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

感谢补充 sitemap / robots 和 RSS canonical URL,这个方向很好,现有 CI 也已经通过。不过静态审查中发现以下几个问题,建议修改后再合并:

  1. 未设置 FRONTEND_URL 时,request-origin fallback 实际没有生效

    server/src/services/sitemap.tsgenerateSitemapXml(env, db)generateRobotsTxt(env) 都只调用了 getBaseUrl(env),请求处理器没有把 c.req.url 传进去。因此未配置 FRONTEND_URL 时,sitemap 会生成 /feed/1 之类的相对 URL,robots 也会生成 Sitemap: /sitemap.xml,与 PR 描述中的“回退到请求来源”不一致,也不符合 sitemap 对绝对 URL 的要求。

    建议让两个生成函数接收可选的 request URL,并在实时请求路径传入 c.req.url

  2. sitemap 会包含 unlisted 文章

    当前 feed 查询只有 eq(feeds.draft, 0),没有限制 feeds.listed = 1。这会让原本不出现在公共列表中的文章被搜索引擎发现。现有 RSS 使用的是 draft = 0 AND listed = 1,建议 sitemap 保持同样语义。

  3. 可选配置下,cron 仍会缓存带空站点地址的 RSS

    rssCrontab 使用 env.FRONTEND_URL || "" 生成并写入缓存。由于请求优先读取该缓存,未配置 FRONTEND_URL 的现有部署仍可能长期返回空 id/link 或错误的文章链接,实时请求中的 origin fallback 不会被执行。

    建议在 cron 无法取得 canonical URL 时跳过预生成,或者将 FRONTEND_URL 改为预生成路径的必需配置;不要写入无效缓存。sitemap/robots 的 cron 也需要采用相同策略。

  4. 建议补充回归测试

    至少覆盖:

    • 配置和未配置 FRONTEND_URL 的实时 sitemap/robots;
    • sitemap 不包含 draft/unlisted;
    • cron 未配置 canonical URL 时不会覆盖有效缓存;
    • sitemap 与 robots 输出的 URL 均为绝对 URL。

修复以上问题后,这个 PR 的整体架构可以继续沿用。

@hohouman
hohouman marked this pull request as draft August 19, 2026 18:57
@hohouman

Copy link
Copy Markdown
Contributor Author

改动

  • sitemap 文章筛选与 RSS 对齐:仅包含已发布且已列出的文章。
  • 将固定 /about 页面作为例外:即使未列出,只要已发布仍会进入 sitemap。
  • sitemap 与 robots 在未配置 FRONTEND_URL 时,使用当前请求 origin 生成绝对 URL。
  • 未配置 FRONTEND_URL 时,RSS、sitemap、robots 不再读取或写入共享对象存储缓存,避免多域名访问时缓存错误的 canonical URL。
  • RSS、sitemap、robots 的 cron 预生成仅在配置 FRONTEND_URL 时执行。

@hohouman
hohouman marked this pull request as ready for review August 19, 2026 19:19
@OXeu
OXeu merged commit e181ead into openRin:main Aug 19, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants