IPFS Gateway有兩種非別為Path gateway、Subdomain gateway,而Cloudflare Web3提供的Universal Path gateway就是Path gateway,但我們也可以透過Workers來建構自己的Subdomain Gateway。
Path gateway VS Subdomain gateway
IPFS的原理我就不多做介紹,我們要知道每個網站上傳到IPFS上後都會有個CID,我們可以將CID設定到DNS的txt紀錄,就可以綁定到網域上。
我們可以透過任Public Gateway來訪問網站,下圖中只有Origin有打勾的才是Subdomain gateway,他會自動跳轉到subdomain,使得網站會在獨立的網域上。

我們舉Cloudflare兩個免費公開的gateway並使用數位部官網為例。可以透過下面這網址進行訪問:
- Path Gateway: https://cloudflare-ipfs.com/ipns/moda.gov.tw
- Subdomain Gateway: https://cf-ipfs.com/ipns/moda.gov.tw 自動跳轉到 https://moda-gov-tw.ipns.cf-ipfs.com/
第二個網址會自動跳轉到subdomain的方式,好處是可以避免相對路徑設定不全產生無法瀏覽的問題,對於前端的cookie、localstroage安全性也較高。也可以從上面網址觀察到subdomain會用 - 取代原本網域的 . 。
CID
我們也可以透過IPFS的CID訪問網站,透過dig _dnslink.moda.gov.tw txt,可以找到moda.gov.tw的CID是QmZzWQrRStXBBb5pEFaWNh5kEMYwQXeDaf1on7rsL5WAK6。

這時候也可以CID來訪問網站:
- Path Gateway: https://cloudflare-ipfs.com/ipfs/QmZzWQrRStXBBb5pEFaWNh5kEMYwQXeDaf1on7rsL5WAK6/
- Subdomain Gateway: https://cf-ipfs.com/ipfs/QmZzWQrRStXBBb5pEFaWNh5kEMYwQXeDaf1on7rsL5WAK6/自動跳轉到 https://bafybeifnem7ljtnibmyriwcbl7ft7qpjot2scshiubl3visqztyyo5glau.ipfs.cf-ipfs.com/
你會發現前面出現一個bafy…的東西,那是因為IPFS有規範如果要做成subdomain這串hash有特別算過,可以參考官方文件。由於這部分比較麻煩,我範例就展示如何做IPNS就好。
Universal Path Gateway
Cloudflare提供Public gateway功能,我們先從建立一個Universal Path Gateway。透過這個Gateway就可以訪問各種網站,跟其他gateway用法一樣,如https://gateway.twcanhelp.me/ipns/moda.gov.tw。

範例
先構思我們服務的目標,我希望moda-gov-tw.gateway.twcanhelp.me可以訪問到IPFS,所以我們需要讀取hostname再來fetch gateway。而不用建立上面自己的Gateway也沒關係,我們用Pinata gateway為例。程式範例如下:
export default { async fetch(request, env) { return new Response(""); try { const { host, pathname, search } = new URL(request.url); const dist = host.split(".")[0].replaceAll("-", "."); const url = "https://gateway.pinata.cloud/ipns/" + dist + pathname + search; return fetch(url, request); } catch(e) { return new Response(e, { status: 500 }) } }}只要訪問a-b-c.twcanhelp.me就會去fetch gateway.pinata.cloud/ipns/a.b.c,取得IPFS內容。再來設定上路由到*.gateway.twcanhelp.me/*,由於我們是用在subdomain下,還需要在Cloudflare另外購買subdomain的SSL憑證。

結語
今天講到透過Workers就可以簡單實作一個Subdomain Gateway範例,外部提供的Gateway很少,就可以自己做一個。