在使用 Hugo 搭建的网站时,订阅 RSS 只获取到部分内容(比如摘要或前半部分,后面为空),通常是因为Hugo默认的RSS模板只输出了文章的摘要(.Summary
),而不是全文(.Content
)。这是 Hugo 的内置行为,旨在保持 RSS 文件简洁,可以通过自定义 RSS 模板来解决这个问题。
原因分析
- 默认模板限制 Hugo 的默认 RSS 模板(内置于 Hugo 核心代码中)在
<description>
标签中使用了{{ .Summary | html }}
,这只会输出文章的自动生成的摘要(通常是文章开头的一部分,长度有限)。如果你没有明确指定全文输出,后面内容自然就为空。- 手动摘要设置 在文章的 Markdown 文件中使用了"
" 分隔符,Hugo 会以这个分隔符为界生成摘要,RSS 默认只会显示分隔符之前的内容。
- 主题覆盖问题 Hugo 主题自定义了 RSS 模板(位于
themes/你的主题/layouts/_default/rss.xml
),可能主题开发者选择只输出摘要而非全文。
解决方法
要让 RSS 包含全文,你需要自定义 RSS 模板,将 .Summary
替换为 .Content
。具体步骤如下:
创建或编辑 RSS 模板
- 默认情况下,Hugo 使用内置的 RSS 模板。如果你的项目根目录或主题目录下没有
layouts/_default/rss.xml
文件,你需要创建一个。 - 操作步骤:
- 在项目根目录下创建文件夹
layouts/_default/
(如果不存在)。 - 创建文件
rss.xml
,路径为layouts/_default/rss.xml
。 - 从 Hugo 官方默认模板复制代码(可从 Hugo GitHub 获取),或者直接使用以下简化版模板:
- 在项目根目录下创建文件夹
1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
3 <channel>
4 <title>{{ .Site.Title }}</title>
5 <link>{{ .Site.BaseURL }}</link>
6 <description>{{ .Site.Title }} 的最新内容</description>
7 <generator>Hugo -- gohugo.io</generator>
8 {{ with .Site.LanguageCode }}<language>{{ . }}</language>{{ end }}
9 {{ with .OutputFormats.Get "RSS" }}
10 <atom:link href="{{ .Permalink }}" rel="self" type="application/rss+xml" />
11 {{ end }}
12 {{ range .Site.RegularPages }}
13 <item>
14 <title>{{ .Title }}</title>
15 <link>{{ .Permalink }}</link>
16 <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</pubDate>
17 <guid>{{ .Permalink }}</guid>
18 <description>{{ .Content | html }}</description>
19 </item>
20 {{ end }}
21 </channel>
22</rss>
修改关键部分
- 在上述模板中,
<description>{{ .Content | html }}</description>
是关键行。这里使用了.Content
,它会输出文章的完整 HTML 内容,而不是.Summary
。 - 如果用的是默认模板,可能是
<description>{{ .Summary | html }}</description>
,这就是只显示部分内容的原因。
重新生成网站
- 修改模板后,运行
hugo
命令重新生成静态文件。 - 检查生成的
public/index.xml
(或你配置的其他 RSS 文件路径),确认<description>
标签中包含了全文。
测试 RSS 订阅
- 用 RSS 阅读器(如 feeder)订阅你的 RSS 地址(博主的是
域名/rss.xml
),确认全文是否正确显示。
注意事项
- 图片路径问题 如果文章中有图片,RSS 可能无法正确显示相对路径的图片(比如
<img src="/images/test.jpg">
)。你需要确保图片使用绝对路径,可以在模板中用.Permalink
动态拼接:1<description>{{ .Content | replaceRE `<img src="/(.*?)">` (printf `<img src="%s$1">` .Site.BaseURL) | html }}</description>
- 文件大小 全文输出可能会导致 RSS 文件变大,尤其是文章较多时。如果你的网站有很多长篇文章,建议在
hugo.yaml
中限制 RSS 条目数量:1[services] 2 [services.rss] 3 limit = 10 # 限制为最近 10 篇
- 手动摘要与全文兼容 如果你仍想保留手动摘要(
<!--more-->
),但希望 RSS 显示全文,可以不在文章中使用分隔符,或者在模板中明确使用.Content
而忽略摘要。