别和播客托管平台绑死:自己托管 RSS 订阅源
原文由 Michael Lynch 于 发布,订阅该博客
假设你的播客托管在 Libsyn 或 Podbean 这样的平台上。如果你决定更换托管平台,会发生什么?你之前已经把指向旧平台的 RSS 链接分发给了所有人。
比如,Libsyn 会为你的播客生成这样一个 RSS 链接:
https://feeds.libsyn.com/12345/rss
当你把播客提交到 Apple Podcasts 并把 RSS 链接分享给听众时,你实际上是让他们直接指向了你的托管平台。
一旦你更换平台,所有听众的播客客户端仍会到旧链接去寻找你的节目。
不要依赖重定向
大多数播客在更换平台时,会要求旧平台设置重定向。比如,你要从 Libsyn 搬到 Podbean,就会在 Libsyn 的设置里把地址指向新的播客链接。
这样,每当有听众尝试访问旧的 Libsyn RSS 链接时,Libsyn 就会告诉对方你已经搬家了。
这种做法有两个问题:
- 并非所有播客播放器在看到重定向时都会更新链接,因此它们会永远继续请求你的旧订阅源。
- 无法保证旧的播客托管方会一直为你提供重定向服务。
第二点尤其关键。试想一下,如果你是播客托管平台,为什么要提供一个帮助客户离开自己平台的功能?如果平台为了维持经营而捉襟见肘,重定向很可能就是最早被砍掉的功能之一。
那么,该怎么办?你总得给听众一个播客链接,又该如何避免这个问题呢?
自己托管 RSS 订阅源
播客托管平台看似只提供一项服务,实际上却托管了两项完全不同的服务。
当你把播客托管在 Libsyn 或 Podbean 上时,它们实际上是为你托管了两种不同类型的文件:
- 你的音频/视频文件
- 播客的 RSS 订阅源,也就是所有节目的索引
但这两项服务其实是完全独立的。如果你愿意,完全可以把它们分别交给不同的服务商托管,一切都能正常运作。这也是我自己的做法,我也建议其他播客主这么做。
这两项服务在技术上都不难,但第二项的成本极低。
播客的录制文件通常很大,根据时长、音质以及是否包含视频,大小在 50 MB 到 5 GB 之间。而播客的 RSS 订阅源则非常小,一般不到 1 MB。按托管成本计算,听众每检查 1 万次你的订阅源,你大约只需支付 1 美分。
你只需在播客服务商前面架设一个 CDN,就能简单又便宜地自行托管 RSS 订阅源。这个 CDN 只负责分发你的 RSS 订阅源,播客播放器仍会直接从托管平台获取体积较大的音频/视频文件。
只分发你自己的自定义域名
当你把像 https://feeds.libsyn.com/12345/rss 这样的链接分发给听众和播客目录时,你就和 Libsyn(或你的托管服务商)绑死了。
相反,你应该只分发属于你自己域名的 RSS 链接。
例如,如果你的播客叫“My Awesome Dinosaur Podcast”,你就可以为节目注册这样一个域名:
- myawesomedinosaurpodcast.com
注:本文不介绍如何购买域名,这超出了讨论范围,任何域名注册商都可以。我个人比较喜欢 DNSimple。
之后你分发给听众和播客目录的订阅源地址就是:
如果你更换了托管平台,听众完全无需做任何操作,他们仍然通过同一个 feeds.myawesomedinosaurpodcast.com 地址收听。他们从头到尾都不会看到任何 Libsyn 或 Podbean 的链接。
自行托管 RSS 订阅源
在这个示例中,我将使用以下示例值:
https://feeds.libsyn.com/12345/rss: 播客托管方让你使用的 RSS 订阅源。https://feeds.myawesomedinosaurpodcast.com: 你实际对外使用的链接。
创建 BunnyCDN 账号
首先,在 BunnyCDN 上注册一个账号。
你也可以用任何其他 CDN,但我喜欢 Bunny,因为它简单又便宜。
添加 Pull Zone
登录 Bunny 账号后,前往 CDN > Add Pull Zone。
给 Pull Zone 起个名字,随便起什么都行。在本例中,我用的名字是 example12345。
在 Origin Type 下选择“Origin URL”,然后填入服务商提供的播客 RSS 链接:
选择“Standard Tier”。
在“Pricing Zones”中,只选择最便宜的选项,取消其他所有选项。RSS 订阅源在全球各地是否都极速访问并不重要,因为这不会影响听众的收听体验。
最后,点击“Add Pull Zone”。
测试链接
Bunny 创建好 Pull Zone 后,尝试访问它在顶部生成的 b-cdn.net 链接:
如果设置成功,访问该链接时你应该能看到播客的 RSS 订阅源(浏览器可能会自动下载该文件)。
如果一切正常,最难的部分就已经完成了。接下来只需设置你的自定义域名。
绑定自定义域名
在你刚创建的 Pull Zone 中,前往 General > Hostnames。
输入你的播客域名,例如:
feeds.myawesomedinosaurpodcast.com
注:子域名不一定非得是 feeds,你可以起任何名字,不过我觉得 feeds 是一个不错的约定。
Bunny 会给你一条 DNS 记录,你需要在域名注册商那边进行设置。
回到你注册域名的地方,添加 Bunny 显示的那条 DNS 记录。
在域名注册商处添加完 CNAME 记录后,回到 Bunny 页面,点击“Verify & Activate SSL”。
覆盖缓存设置
Bunny(以及所有 CDN)都会积极地缓存数据。它们的设计初衷是减轻源站的负载,因此 Bunny 默认只会偶尔去检查“Origin URL”(即你的播客服务商)是否有更新。
这可能会妨碍听众及时获取更新。你肯定不希望更新了播客,却因为 Bunny 还在提供旧的缓存,导致一两天内都没人能看到更新。
你可以进入 Pull Zone 的 Caching > General,来防止 Bunny 提供过期的播客订阅源。
将“Cache Expiration Time”改为“Override: 20 minutes”。
这会让 Bunny 对播客订阅源的缓存最多只保留 20 分钟。你可以根据自己的喜好调高或调低这个时间。
我不建议选择“Do not cache”。如果你的播客很受欢迎,可能会有数百名听众同时检查订阅源,这会导致 Bunny 同时向你的播客服务商发送数百个请求,服务商可能会因此屏蔽来自 Bunny 的请求,进而让听众看到报错信息。
替换规范链接
RSS 订阅源有一个细节,它里面包含一个如下所示的 self 标签:
<atom:link href="https://feeds.libsyn.com/12345/rss" rel="self" type="application/rss+xml"/>即使你分发的是 https://feeds.myawesomedinosaurpodcast.com 这个链接,一些播客播放器仍会优先使用 self 标签中的链接,而不是原始链接,这样就会绕过你通过 CDN 托管的版本。
要避免这种情况,你需要使用自定义的 Bunny 边缘脚本。
- 前往 Edge Platfrom > Scripting,点击“Add Script”。
- 选择“Deploy and edit on Bunny.net”
- 将脚本命名为“Replace RSS self tag”
- 将 Type 改为“Middleware”
- 点击“Add Script”
- 在代码编辑器中输入以下代码:
import * as BunnySDK from "https://esm.sh/@bunny.net/[email protected]";
// Replace with the vendor-specific URL to your RSS feed.
const SOURCE_URL = "https://feeds.libsyn.com/12345/rss";
// Replace with the domain name that you own.
const TARGET_URL = "https://feeds.myawesomedinosaurpodcast.com";
/**
* Modifies the response from the origin to replace a specific URL.
*
* @param {Context} context - The context of the middleware.
* @param {Request} request - The current request done to the origin.
* @param {Response} response - The HTTP response or string.
*/
async function onOriginResponse(context: { request: Request, response: Response }): Promise<Response> | Response | void {
const responseText = await context.response.text();
// Replace the URL with simple string replacement
const modifiedText = responseText.replace(SOURCE_URL, TARGET_URL);
// Create a new response with the modified text
return new Response(modifiedText, {
status: context.response.status,
statusText: context.response.statusText,
headers: context.response.headers
});
}
BunnySDK.net.http.servePullZone()
.onOriginResponse(onOriginResponse);最后,点击“Connect Pull Zone”按钮,将该脚本关联到你的 RSS 订阅源。
大功告成!
如果设置正确,你现在应该已经拥有一个可提供播客订阅源的自定义链接了。
现在这个链接完全由你掌控。以后即使更换播客托管平台,也只需更新 BunnyCDN Pull Zone 中的“Origin”字段即可。再也不用处理重定向,也不必担心旧平台会把你套牢。
随机一篇博客



评论
登录后参与讨论