別跟 Podcast 託管平台綁死:自行託管你的 Podcast Feed
假設你把 Podcast 託管在像 Libsyn 或 Podbean 這樣的平台上。如果決定更換 Podcast 平台,會發生什麼事呢?你已經把指向舊平台的 RSS URL 發給了所有人。
舉例來說,Libsyn 會為你的 Podcast 提供像這樣的 RSS URL:
https://feeds.libsyn.com/12345/rss
當你把 Podcast 提交到 Apple Podcasts 並與聽眾分享 RSS URL 時,你其實是直接把他們導向你的 Podcast 託管平台。
如果你搬移平台,聽眾的 Podcast App 仍會在舊的 URL 上尋找你的節目。
別依賴重新導向
大多數 Podcast 在更換平台時,會要求舊平台設定重新導向。舉例來說,如果你要從 Libsyn 搬到 Podbean,你會到 Libsyn 的設定中,將它指向新的 Podcast URL。
這樣一來,每當聽眾嘗試存取舊的 Libsyn RSS URL 時,Libsyn 就會告訴他們你已經搬家了。
這個策略有兩個問題:
- 並非所有 Podcast 播放器在看到重新導向時都會更新 URL,因此它們會永遠持續檢查你的舊 Feed。
- 無法保證舊的 Podcast 託管商會繼續為你提供重新導向服務。
第 2 點尤其重要。如果你是一家 Podcast 託管平台,為什麼要提供一個幫助客戶離開自家平台的功能?如果該平台開始為維持營運而掙扎,重新導向很可能是最先被取消的功能之一。
那麼,該怎麼做呢?你需要給聽眾一個 Podcast 的 URL,要如何避免這個問題?
自行託管你的 RSS feed
Podcast 託管平台實際上提供兩種不同的服務,雖然看起來像是同一回事。
當你透過 Libsyn 或 Podbean 託管 Podcast 時,他們實際上是為你託管兩種不同類型的檔案:
- 你的音訊/影片錄製檔
- 你的 Podcast RSS feed,也就是所有錄製內容的索引
但這兩種服務其實是完全獨立的。如果你願意,可以分別用兩家不同的廠商來託管,而且一切都能正常運作。這正是我自己的做法,也是我推薦其他 Podcast 經營者採用的方式。
這兩種服務在技術上都不困難,但第 2 種服務的成本極低。
Podcast 錄音檔通常是很大的檔案,大小從 50 MB 到 5 GB 不等,取決於長度、品質以及是否包含影片。但 Podcast 的 RSS feed 非常小,通常不到 1 MB。以託管成本來說,聽眾每檢查 10,000 次你的 Podcast feed,你大約只需支付 1 美分。
你可以在 Podcast 服務商前面架設一個 CDN,就能簡單又便宜地託管你的 RSS feed。這個 CDN 只負責提供你的 RSS feed,Podcast 播放器仍會直接從你的 Podcast 服務商取得大型的音訊/影片檔案。
只發佈你自己擁有的自訂網域名稱
當你把像 https://feeds.libsyn.com/12345/rss 這樣的 URL 發給聽眾和 Podcast 目錄時,你就等於跟 Libsyn(或你的託管服務商)綁死了。
相反地,你應該只發佈你自己擁有的網域名稱所對應的 RSS URL。
舉例來說,如果你的 Podcast 叫做「My Awesome Dinosaur Podcast」,你可以為節目註冊這個網域名稱:
- myawesomedinosaurpodcast.com
備註:我不會說明如何購買網域名稱,因為這超出了本文範圍,不過任何網域註冊商都可以。我個人推薦 DNSimple。
當你把 Podcast feed 提供給聽眾和 Podcast 目錄時,網址會是:
如果你更換 Podcast 託管商,聽眾完全不需要做任何事,因為他們仍然是透過同一個 feeds.myawesomedinosaurpodcast.com URL 收聽。他們從來沒有看過任何 Libsyn 或 Podbean 的 URL。
自行託管 RSS feed
在這個範例中,我將使用以下範例數值:
https://feeds.libsyn.com/12345/rss:你的 Podcast 託管商要你使用的 RSS feed。https://feeds.myawesomedinosaurpodcast.com:你實際要使用的 URL。
建立 BunnyCDN 帳號
首先,在 BunnyCDN 建立一個帳號。
你可以使用任何 CDN 來做這件事,但我喜歡 Bunny,因為它簡單又便宜。
新增 Pull Zone
在你的 Bunny 帳號中,前往 CDN > Add Pull Zone。
為你的 Pull Zone 取一個名稱,取什麼名字都無所謂。在這個範例中,我使用的名稱是 example12345。
在 Origin Type 底下,選擇「Origin URL」並輸入你的 Podcast 服務商所提供的 RSS URL:
選擇「Standard Tier」。
在「Pricing Zones」底下,只選擇最便宜的方案並取消選擇其他選項。你的 RSS feed 是否在每個地區都超級快速並不重要,因為這不會影響聽眾的體驗。
最後,點擊「Add Pull Zone」。
測試你的 URL
當 Bunny 建立好你的 Pull Zone 後,嘗試造訪它在頂端建立的 b-cdn.net URL:
如果設定成功,當你造訪該連結時,應該會看到你的 Podcast RSS feed(瀏覽器可能會自動下載該檔案)。
如果一切正常,最困難的部分就已經完成了。你只需要設定你的自訂網域名稱。
連結你的自訂網域
在你建立的 Pull Zone 中,前往 General > Hostnames。
輸入你的 Podcast 網域,例如:
feeds.myawesomedinosaurpodcast.com
備註:子網域不一定非得是 feeds,你可以取任何你想要的名稱,不過我覺得 feeds 是個實用的慣例。
Bunny 會給你一筆 DNS 紀錄,你需要在網域註冊商那邊啟用它。
回到你註冊網域的地方,新增 Bunny 顯示給你的 DNS 紀錄。
在你的網域註冊商新增完 CNAME 紀錄後,回到 Bunny 的畫面,然後點擊「Verify & Activate SSL」。
覆寫快取設定
Bunny(以及所有 CDN)會積極地快取資料。它們的設計目的是減輕其他伺服器的負載,因此 Bunny 預設只會偶爾檢查「Origin URL」(你的 Podcast 服務商)是否有更新。
這可能會妨礙聽眾及時收到更新。你不會希望更新了 Podcast 之後,卻因為 Bunny 還在提供舊的副本,導致一兩天內都沒有人看到更新。
你可以前往 Pull Zone 中的 Caching > General,防止 Bunny 提供過時的 Podcast feed 副本。
將「Cache Expiration Time」改為「Override: 20 minutes」。
這會告訴 Bunny 最多只快取你的 Podcast feed 20 分鐘。你可以依自己的偏好調高或調低這個時間。
我不建議選擇「Do not cache」。如果你有一個熱門的 Podcast,可能會有數百位聽眾同時檢查你的 feed,這會導致 Bunny 同時向你的 Podcast 服務商發送數百個請求,進而可能導致你的 Podcast 服務商阻擋來自 Bunny 的請求,讓聽眾看到錯誤訊息。
替換 canonical URL(標準網址)
RSS feed 有一個細節是,它包含一個看起來像這樣的 self 標籤:
<atom:link href="https://feeds.libsyn.com/12345/rss" rel="self" type="application/rss+xml"/>即使你發佈的是 https://feeds.myawesomedinosaurpodcast.com 這個 URL,某些 Podcast 播放器仍會優先使用 self 標籤而非原始 URL,這會繞過你透過 CDN 託管的版本。
為了避免這個情況,你需要使用自訂的 Bunny edge script。
- 前往 Edge Platfrom > Scripting 並點擊「Add Script」。
- 選擇「Deploy and edit on Bunny.net」
- 將 Script 命名為「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」按鈕,將此 Script 連結到你的 RSS feed。
完成了!
如果設定正確,你現在應該已經擁有一個提供 Podcast feed 的自訂 URL 了。
你現在擁有一個由你掌控的 URL。日後若要更換 Podcast 平台,只要更新 BunnyCDN Pull Zone 中的「Origin」欄位即可。你再也不需要處理重新導向,也不用擔心舊平台會試圖把你綁住。
隨機一篇部落格


