Table of Contents
RSS 与 Atom:WordPress Feed 发现、验证与迁移
现代网站不需要为每个阅读器生成专属“订阅按钮”。更稳健的做法是发布一个长期稳定、可验证的 RSS 或 Atom URL,在页面 <head> 中声明自动发现链接,再提供清晰的普通文本链接。读者可把同一 URL 交给任何兼容阅读器,网站也不会绑定某个供应商。
本文最后核对于 2026 年 9 月 1 日。2011 年原文保存在文末作为历史资料,其中的服务按钮不得继续使用。
1. 旧服务现状
| 2011 年入口 | 2026 年证据 | 维护版处理 |
|---|---|---|
| Google Reader | Google 在官方公告中说明于 2013 年 7 月 1 日停止 Google Reader | 已停止;不再展示订阅按钮 |
| 鲜果 | 原按钮域名当前跳转到域名交易页面 | 无法作为稳定订阅入口;不链接 |
| 抓虾 | 原主机在本次审计中无法解析,且未找到当前官方按钮文档 | 仅判定为不适合当前使用,不推断正式停服日期 |
| QQ 邮箱订阅入口 | 原 HTTP 主机在本次审计中无法连接,且未找到当前官方 RSS 按钮文档 | 不作为当前入口;不要要求读者登录 QQ |
| 第三方图片下载 | 原链接是非 HTTPS 的账户式下载路径 | 已从公开存档中窄范围删除 |
Google Reader 的停止时间来自 Google 官方公告。对于其余服务,本表只报告 2026 年 9 月 1 日的端点审计结果;没有第一方停服公告时,不虚构停服日期。
2. 选择稳定的 Feed URL
WordPress 默认生成多种 Feed。启用固定链接时,常见地址如下;最后一行是查询参数形式的 RSS 2.0 回退地址:
https://example.com/feed/
https://example.com/feed/atom/
https://example.com/comments/feed/
https://example.com/category/news/feed/
https://example.com/?feed=rss2
选择一个 HTTPS 主 Feed 作为规范地址,通常是 /feed/。页面、自动发现、站点地图或文档中都使用同一绝对 URL。分类、标签和评论 Feed 只有在读者确实需要时才公开,避免让一组相似入口造成困惑。
3. 添加标准自动发现
WHATWG 为 Feed 自动发现指定 rel="alternate",并识别 application/rss+xml 与 application/atom+xml。在 <head> 中加入:
<link
rel="alternate"
type="application/rss+xml"
title="Example Site — RSS"
href="https://example.com/feed/"
>
<link
rel="alternate"
type="application/atom+xml"
title="Example Site — Atom"
href="https://example.com/feed/atom/"
>
每个 title 应描述站点与格式,href 应是最终的 HTTPS 绝对地址。若只维护一种格式,只发布一条,避免声明失效或内容重复的 Feed。
WordPress 区块主题默认启用自动 Feed 链接;经典主题可在 functions.php 的主题初始化中启用:
<?php
add_action( 'after_setup_theme', function () {
add_theme_support( 'automatic-feed-links' );
} );
先查看生成后的 HTML 源码,避免主题、SEO 插件和手写代码重复输出同一发现链接。
4. 提供不绑定厂商的订阅入口
页面上写“通过 RSS 订阅”或“复制 Feed 地址到你选择的阅读器”即可。不要恢复“添加到 Google/鲜果/抓虾/QQ”按钮,也不要自动打开第三方登录页。
选择阅读器时可比较:是否支持 RSS 与 Atom、键盘和屏幕阅读器、跨设备或本地存储、离线能力、隐私政策、费用、维护状态,以及 OPML 导入和导出。本文不推荐特定供应商;开放 URL 和可导出的订阅列表比某个品牌按钮更耐久。
5. RSS 与邮件简报是两种渠道
Feed 阅读器定期拉取公开 XML,发布者通常不需要知道读者的邮箱。邮件简报会收集地址并主动发送消息,不能把 RSS 订阅者自动转成邮件联系人。
若提供邮件简报:
- 在表单旁明确说明发送者、内容、频率、数据用途、处理服务商和隐私政策。
- 根据适用司法辖区取得并记录有效同意或其他合法依据;不要使用预选框、购买名单或从其他用途挪用地址。
- 提供可用、易找且及时生效的退订方式,并只为履行退订保留必要的抑制记录。
- 限制访问与保存期限,签订所需的数据处理协议,并处理访问、删除或投诉请求。
- 法律规则会因收件人和发送者所在地而变;英国 ICO 的电子邮件营销指南和美国 FTC 的 CAN-SPAM 指南只是两个司法辖区的官方起点,不替代本地法律意见。
6. HTTP、MIME、缓存与重定向诊断
一个可用 Feed 应满足以下边界:
- 使用 HTTPS;在有限次数重定向后返回成功的 XML,而不是登录页、验证码、WAF 挑战或 HTML 错误页。
- RSS 自动发现使用
application/rss+xml,Atom 使用 RFC 4287 定义的application/atom+xml。不要统一错误地返回text/html。 - XML 必须结构良好;RSS 项目的
guid或 Atomid、项目链接和日期应稳定且可解析。 ETag、Last-Modified和合理的Cache-Control能帮助阅读器条件请求。缓存既不能让新文章长期不可见,也不应迫使每次请求都完整重传。- 重定向不能循环或形成长链;迁移后的最终地址、自动发现与页面链接应一致。
下面的命令使用 curl 和 Python 标准库,检查完整响应链、响应头、XML 结构和根元素,不需要第三方包:
FEED_URL='https://example.com/feed/'
feed_xml="$(mktemp)"
feed_headers="$(mktemp)"
trap 'rm -f -- "$feed_xml" "$feed_headers"' EXIT
curl --fail --silent --show-error \
--location --max-redirs 5 \
--dump-header "$feed_headers" \
--output "$feed_xml" \
"$FEED_URL"
sed -n '1,30p' "$feed_headers"
FEED_FILE="$feed_xml" python3 - <<'PY'
from pathlib import Path
import os
import xml.etree.ElementTree as ET
path = Path(os.environ["FEED_FILE"])
data = path.read_bytes()
root = ET.fromstring(data)
name = root.tag.rsplit("}", 1)[-1]
if name not in {"rss", "feed", "RDF"}:
raise SystemExit(f"unexpected root element: {root.tag}")
print(f"well-formed XML; root={root.tag}; bytes={len(data)}")
PY
随后人工确认最终响应的 Content-Type、缓存头和正文。XML 可解析只是第一层检查;公开 Feed 还应在 W3C Feed Validation Service中交互式验证。该公共服务的使用条款不允许把它当成自动批处理 API;CI 应运行经批准的本地验证器。
7. 可访问入口、图标与品牌
- 使用可理解的链接文字,如“通过 RSS 订阅”,不要只放一个无名称的橙色图标。
- 图标与文字同时出现时,可把重复图标标为装饰;只有图标时,图片替代文本或 SVG 的可访问名称必须表达“RSS Feed”。
- 保持可见键盘焦点、足够对比度和触控尺寸;链接应在不依赖颜色或悬停提示时仍能理解。
- 通用 Feed 图形可以辅助识别,但不要把已停用服务的 Logo 当作当前功能,也不要暗示厂商认可。使用任何品牌资产前检查商标与最新版品牌指南。
- 不要把订阅操作放在自动弹窗、强制登录或同意邮件营销之后。
8. Analytics 与隐私
Feed 请求可能来自共享代理、云阅读器、缓存或多个设备,因此请求量不等于人数。把指标限制在运维需要的聚合数据,例如成功率、响应时间、流量与错误类型;不要宣传虚假的“订阅人数”。
服务器日志可能包含 IP、User-Agent 和访问时间。按适用法律说明用途、限制权限和保留期。不要在 Feed URL、guid、Atom id 或项目链接中放邮箱、用户 ID、唯一跟踪参数或第三方广告重定向。若使用额外追踪技术,先完成隐私评估并取得当地法律要求的同意。
9. 迁移而不丢失订阅者
- 选定新的规范 HTTPS Feed,并先验证内容、ID、日期和 MIME。
- 保持旧 URL 可访问,用服务器端永久重定向指向新 URL;根据部署和客户端兼容性选择 301 或 308,不使用 JavaScript 或 meta refresh。
- 避免多跳链,验证 GET 和条件请求;不要把 Feed 重定向到首页。
- 更新
<link rel="alternate">、页面订阅链接、文档和站点配置。 - 保持项目
guid或 Atomid不变,否则阅读器可能把旧文章当成新文章。 - 长期保留旧路径并监控错误。只有确认读者已经迁移后,才评估是否移除。
- 若更换邮件服务,单独迁移同意证明、退订抑制记录与隐私通知;不要把 Feed 请求日志导入邮件名单。
HTTP 永久重定向语义见 RFC 9110,缓存行为见 RFC 9111。
10. 无依赖的完整 HTML 示例
下面的页面同时提供自动发现和可访问的文本链接,不加载任何脚本、远程图标或分析器。替换域名、标题与邮件简报页面后再发布。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Example Site subscriptions</title>
<link
rel="alternate"
type="application/rss+xml"
title="Example Site — RSS"
href="https://example.com/feed/"
>
<link
rel="alternate"
type="application/atom+xml"
title="Example Site — Atom"
href="https://example.com/feed/atom/"
>
<style>
body {
max-width: 48rem;
margin: 2rem auto;
padding: 0 1rem;
font: 1rem/1.6 system-ui, sans-serif;
}
a:focus-visible {
outline: 0.2rem solid currentColor;
outline-offset: 0.2rem;
}
</style>
</head>
<body>
<header>
<h1>Example Site</h1>
</header>
<main>
<section aria-labelledby="subscribe-heading">
<h2 id="subscribe-heading">Subscribe</h2>
<p>Copy either feed URL into any standards-compatible feed reader.</p>
<ul>
<li><a href="https://example.com/feed/">Subscribe via RSS</a></li>
<li><a href="https://example.com/feed/atom/">Subscribe via Atom</a></li>
</ul>
<p>
Prefer email?
<a href="/newsletter/">Review the separate newsletter terms</a>.
</p>
</section>
</main>
</body>
</html>
11. 发布前验证清单
- [ ] 规范 Feed 使用 HTTPS,且无需 Cookie、登录或 JavaScript。
- [ ] RSS/Atom 格式、MIME 与
<link rel="alternate">声明一致。 - [ ] XML 结构、标题、项目链接、日期以及稳定 ID 已验证。
- [ ] 页面提供可见、可聚焦、有明确名称的普通 Feed 链接。
- [ ] 没有旧阅读器按钮、失效 Logo、私密下载或厂商登录入口。
- [ ] 响应头、有限重定向、缓存和条件请求行为已检查。
- [ ] W3C Feed Validator 已交互式检查;私密或批量内容使用本地工具。
- [ ] Feed URL 与项目标识不含邮箱、个人 ID 或唯一追踪参数。
- [ ] 邮件简报有独立告知、合法依据、退订、保存与供应商治理。
- [ ] 迁移保留旧 URL 的永久重定向与稳定
guid/Atomid。 - [ ] 阅读器选择保持中立,并测试键盘、缩放与辅助技术。
12. 权威资料
- Google:Google Reader 停止公告
- WHATWG:Feed 自动发现
- RSS Advisory Board:RSS 2.0 规范
- IETF RFC 4287:Atom Syndication Format
- WordPress:Feeds
- WordPress:Theme Functions 与 automatic-feed-links
- W3C Feed Validation Service
- IETF RFC 9110:HTTP Semantics
- IETF RFC 9111:HTTP Caching
- UK ICO:电子邮件营销
- US FTC:CAN-SPAM 合规指南
13. 2011 年原文存档
以下保留 source_export 中除明确披露内容外的完整可见正文。仅规范化每行末尾空白;抓虾链接中的历史 logId 跟踪参数已删除,第三方下载中的账户式私密路径已替换为占位符。未改动的导出仍保存在仓库的 source_export 路径中。
警告:以下服务、按钮、登录入口和 HTTP 链接属于历史资料,不应作为当前订阅或下载入口。
给博客增加RSS订阅到Google、鲜果、抓虾、QQ邮箱功能
一直想把水石居的订阅部分修改一下,直到现在才有时间处理,现在唯一提供的是QQ订阅的功能。今天终于有时间把抓虾、Google reader和鲜果都玩了一把。对水母这种平时很忙的人来说,RSS订阅还是比较有用的,可以及时查看自己关注的博客是否有更新,不用一个个的敲入网址访问了。
我们要做的就是获取RSS订阅按钮和代码,然后放到我们的网站上即可。目前Google Reader、抓虾、鲜果和QQ邮箱都提供自动生成订阅按钮和代码的功能,我们只需要访问相应的网址,输入我们的RSS源地址以及其他一些样式配置信息等即可生成订阅代码,一般wordpress博客的RSS源地址为:http://您的域名/feed
**RSS订阅到Google Reader**
生成订阅代码的网址是:
[http://www.google.com/intl/zh-cn/webmasters/add.html](http://www.google.com/intl/zh-cn/webmasters/add.html)
这个网页是全英文的,不懂英语也没有关系,总共就三个选项加一个填空,选项选第一个就可以,填空的地方填写自己的RSS源地址,然后点击【Generate HTML】按钮就可以生成代码了,另外还是生成一个测试按钮,点击可以查看订阅时的效果。
**RSS订阅到鲜果**
鲜果订阅按钮生成网址:
[http://xianguo.com/tools/sub_button](http://xianguo.com/tools/s ub_button)
鲜果的样式也比较丰富,随便选一个,输入博客地址即可生成相关代码。
**RSS订阅到抓虾**
抓虾订阅按钮生成网址:
[http://www.zhuaxia.com/help/help_sub_1.php](http://www.zhuaxia.com/help/help_sub_1.php)
相比较Google,抓虾的可选按钮样式要丰富的多,有卡通、星座、性感、清爽和经典五大类,在抓虾中直接输入博客地址即可实现订阅。
**RSS订阅到QQ邮箱**
这个要稍微麻烦一点,首先用QQ号登陆:
[http://list.qq.com](http://list.qq.com/)
在这里可以创建栏目,接下来一步步来就可以了,每步都比较简单,相信这点小事难不倒大家的。
我是校园网,无法显示图片,可以先下载了,再传到自己的博客空间里,附上下载地址:
[historical private download path redacted]
**使用方法**
在wordpress博客中有个小工具叫【文本】,其中可以输入任意的文本和HTML代码,剩下的不用多说了吧!
