tech

Cloudflare Workers 綁定自訂網域的正確寫法

TL;DR:wrangler.jsonc 的 routes 用 custom_domain: true,pattern 只填 hostname,不加 /*

TL;DR

routespattern 只填 hostname,不加 /*,搭配 custom_domain: true

情境

部落格部署到 Cloudflare Workers 後,想把 quidproquo.cc 綁上去,取代預設的 *.workers.dev 網址。

問題

wrangler.jsonc 加了這樣的設定:

"routes": [
  { "pattern": "quidproquo.cc/*", "custom_domain": true }
]

wrangler deploy 報錯:

Invalid Routes:
  quidproquo.cc/*:
  Wildcard operators (*) are not allowed in Custom Domains
  Paths are not allowed in Custom Domains

解法

Custom domain 的 pattern 只填 hostname,不帶路徑或萬用字元:

"routes": [
  { "pattern": "quidproquo.cc", "custom_domain": true },
  { "pattern": "www.quidproquo.cc", "custom_domain": true }
]

改完之後需要重新 astro build,因為 Cloudflare adapter 會把設定複製進 dist/server/wrangler.json,直接 wrangler deploy 會用舊的 dist 檔。

為什麼會這樣

Custom domain 和 route pattern 是兩種不同的機制。Route pattern(如 example.com/*)是給 Zone-based routing 用的,會做路徑比對。Custom domain 是直接把整個 hostname 指向 Worker,不需要也不允許路徑。

學到的事

custom_domain: true 的 pattern 就是 hostname,加了路徑就壞。每次改 wrangler.jsonc 都要重新 build。