RSS阅读器只解析独立XML文件,不读取HTML语义标签;HTML中的<main>等对RSS无效,XML需后端显式生成且结构完整,<link rel="alternate">必须正确配置于<head>中。

RSS阅读器不解析HTML正文,只认声明和XML结构本身。所谓“适合抓取的HTML结构”,本质是为人类读者服务的展示页,和RSS无关——但很多人误以为要改HTML才能让RSS更好用。
为什么在HTML里加<main>或<article>对RSS没用
RSS阅读器根本不会加载你的HTML页面,它只请求你配置的/feed.xml或/rss这类独立XML文件。浏览器地址栏里打开https://example.com看到的语义化标签,和https://example.com/feed.xml的内容完全隔离。常见误解是:“我把文章包进<article>,RSS就能自动识别正文”——不会。XML内容必须由后端(PHP/Python/Node)显式生成,字段如<title>、<description>、<pubDate>一个都不能少,且顺序不能乱。
容易踩的坑:
- 在HTML中堆砌
<section>、<header>却忘了配<link rel="alternate" type="application/rss+xml">,导致浏览器RSS图标根本不出现 - 用Pboot或Hugo等CMS时,只改了模板HTML,没同步更新
rss.html或rss.xml模板,结果RSS输出仍是空channel - 把RSS链接写成
./feed.xml,部署到子目录后路径失效,返回404而非XML
<link rel="alternate">必须出现在<head>且属性完整
这是唯一能让Firefox、Safari、Edge等浏览器在地址栏右侧显示RSS订阅图标的机制。缺一不可:
立即学习“前端免费学习笔记(深入)”;
-
rel="alternate":不能写成rel="rss"或漏掉 -
type="application/rss+xml":写成text/xml或application/xml会被Safari忽略 -
href必须是根相对路径(如/feed.xml)或绝对URL(如https://example.com/feed.xml),不能带查询参数 -
title建议填写,否则某些阅读器导入时无法识别源名称
验证方法:禁用所有JS/CSS后查看网页源码,确认该<link>标签确实在<head>内,且无语法错误(比如引号不闭合、属性值没加引号)。
RSS XML文件本身必须满足最小结构要求
哪怕只有一篇文章,feed.xml也得包含<rss>、<channel>、<title>、<link>、<description>,再加至少一个<item>。缺任意一项,Feedly、Inoreader可能静默失败,连错误提示都不给。
关键细节:
-
<pubDate>必须是RFC 822格式,例如Mon, 30 Jun 2026 22:22:00 +0800,用date('r')或datetime.strftime('%a, %d %b %Y %H:%M:%S %z')生成最稳 -
<description>内容若含HTML标签,必须用<![CDATA[...]]>包裹,否则XML解析会崩 - 图片链接必须为绝对URL(如
https://example.com/img/cover.jpg),相对路径在阅读器里全变成404 - 每个
<item>必须有<title>和<link>,否则部分客户端拒绝订阅
动态生成RSS时最容易被忽略的三件事
不是“能不能生成”,而是“生成后是否真能被读取”。很多脚本本地跑通,上线就失效:
- MIME类型必须是
application/rss+xml,Apache/Nginx需显式配置,PHP里要用header('Content-Type: application/rss+xml; charset=utf-8'); - UTF-8编码必须无BOM,Windows记事本保存的
rss.xml常带BOM头,导致XML解析失败;推荐用VS Code或Notepad++另存为“UTF-8 无BOM” - XML必须严格闭合,
<item>不能漏掉</item>,<description>里不能有未转义的&或字符(应转为<code>&和<)
真正难的不是写出来,而是每次改完都用W3C Feed Validator过一遍——它报的错,90%以上都是上述三类问题。别跳过这步。



















