Cloudflare Workers を使うときに把握しておく既知のバグと問題です。
- ルートの具体性を定義するとき、パターン末尾の
/*は期待どおりに動かないことがあります。
同じゾーンにデプロイした 2 つの Worker を考えます。Worker A には example.com/images/* ルート、Worker B には example.com/images* ルートパターンを割り当てます。この状態で、次の URL は次のように解決されます。
// (A) example.com/images/*
// (B) example.com/images*
"example.com/images"
// -> B
"example.com/images123"
// -> B
"example.com/images/hello"
// -> Bすべての例で Worker B が起動します。最後の例も含まれ、ここで想定外の動作が起きます。
サブドメインにワイルドカードを付ける場合、次の URL は次のように解決されます。
// (A) *.example.com/a
// (B) a.example.com/*
"a.example.com/a"
// -> Bwrangler dev --remoteを実行すると、すべての送信リクエストにcf-workers-preview-tokenヘッダーが付き、Cloudflare はこれをプレビューリクエストとして扱います。この扱いは Cloudflare ネットワーク全体に適用されるため、ほかの Cloudflare ゾーンへの HTTP リクエストは、現在セキュリティ上の理由で破棄されます。回避するには、Worker スクリプトに次のコードを入れます。
const request = new Request(url, incomingRequest);
request.headers.delete('cf-workers-preview-token');
return await fetch(request);Worker から fetch() でサブリクエストを行うと、Cloudflare の DNS リゾルバーが使われます。部分(CNAME)セットアップ のゾーンでは、Worker が名前解決する必要があるホスト名すべてに、Cloudflare の DNS セットアップ上の専用 DNS エントリが必要です。ないと Fetch API の呼び出しはステータスコード 530 (1016) で失敗します。
Cloudflare DNS に DNS レコードが不足しているセットアップ
// Zone in partial setup: example.com
// DNS records at Authoritative DNS: sub1.example.com, sub2.example.com, ...
// DNS records at Cloudflare DNS: sub1.example.com
"sub1.example.com/"
// -> Can be resolved by Fetch API
"sub2.example.com/"
// -> Cannot be resolved by Fetch API, will lead to 530 status codesub2.example.com を Cloudflare DNS に追加したあと
// Zone in partial setup: example.com
// DNS records at Authoritative DNS: sub1.example.com, sub2.example.com, ...
// DNS records at Cloudflare DNS: sub1.example.com, sub2.example.com
"sub1.example.com/"
// -> Can be resolved by Fetch API
"sub2.example.com/"
// -> Can be resolved by Fetch APIWorkers のサブリクエストでは、IP アドレスへ直接ではなく、URL に対してだけリクエストできます。この制限を避けるには、ゾーンに A または AAAA の名前レコードを追加 ↗ してから、そのリソースを fetch します。
たとえばゾーン example.com で、種類 A、名前 server、値 192.0.2.1 のレコードを作成し、次のように使います。
await fetch('http://server.example.com')次の書き方は使わないでください。
await fetch('http://192.0.2.1')