本篇講個簡單的範例,當我們某個網站要掛修時候,需要做一個維修公告,我們可以使用Workers幫某個已經上線的domain掛上維修公告,而不需要修改原點伺服器的設定,本篇就來講解此功能。
Workers的自訂網域 VS 路由
我們到Workers後台可以發現兩個設定domain的功能,分別為自訂網域與路由。自訂網域可以將某個網域綁定上Workers,而且網域必須是未在使用中的。而路由則是不同可以提前攔截其他人的網路流量,依據網域與路徑的規則,導入我們的Workers。

從下圖我們可以看出以下兩種模式的差別,我們可以使用路由將某個網站的某個目錄替換掉。

範例一、簡易維修公告
我們以前一篇文的範例網站whoami.twcanhelp.me為例,我想幫他掛上維修網站,我們需要開一個Workers,並使用以下範例:
export default { async fetch(request, env, ctx) { return new Response("維修中"); },};接下來在路由新增一筆whoami.twcanhelp.me/*,就會發現原本網站的路由被導入到維修中。

範例二、HTML維修公告
從上個範例延伸,我們可以做更複雜的公告,使用HTML來做。範例如下,也可以參考官方文件的範例。
export default { async fetch(request) { const html = `<!DOCTYPE html> <body> <h1>維修中</h1> </body>`;
return new Response(html, { headers: { "content-type": "text/html;charset=UTF-8", }, }); },};範例三、禁止國外訪問公告
我們現在做個範例是只有台灣能夠訪問,而國外禁止訪問,我們可以從request.cf中取得使用者國籍,就可以依照不同國家來做判斷。我們需要在Workers上做Fetch取得原本的網站內容來取代原先Reverse Proxy的功能。
如下圖所示,我們將整個a.example.com/*全部路由到Workers上,再來如果發現IP在台灣就fetch 另外一個b.example.com。a.example.com跟b.example.com都看訪問的網站,但由於a.example.com已經綁到Workers上,無法fetch自己的domain,因此我們需要另外建立另外一個也可以訪問到網站的網域。
以我的範例網站為例,就有whoami.twcanhelp.me跟Workers提供的whoami.hchou.workers.dev兩個網域可以用。

承第一個範例我們先將whoami.twcanhelp.me的路由設定到新的Workers,參考以下範例程式,從request.cf.country取得使用者的,如果不是台灣,就去fetch原本的網站的內容https://whoami.hchou.workers.dev,讓台灣的使用者能夠訪問。
export default { async fetch(request, env, ctx) { if (request.cf.country != "TW") { return new Response("維修中"); } else { const url = new URL(request.url); url.host = "whoami.hchou.workers.dev"; return fetch(url, request); } },};範例四、定時公告
同上個範例作法,我們也需要在服務有另外一個備用domain,再來將if判斷式改成判斷時間,建議時間過後還是把路由拔掉,不然Worker運算都是要算錢的,程式碼會如下:
export default { async fetch(request, env, ctx) { const now = new Date(); const start = new Date("2023-05-20T12:00:00+08:00"); const end = new Date("2023-05-20T14:00:00+08:00"); if (start <= now && now <= end) { return new Response("維修中"); } else { const url = new URL(request.url); url.host = "whoami.hchou.workers.dev"; return fetch(url, request); } },};結語
透過以上幾個範例,我們就可以隨時替換掉某個網址的內容,要掛上維修公告,或是判斷條件都是很方便的。