Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

既知の問題

最終更新 Markdown で表示Agent セットアップ

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"
// -> B

wrangler dev

  • wrangler 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);

CNAME セットアップでの Fetch API

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 code

sub2.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 API

IP アドレスへの Fetch

Workers のサブリクエストでは、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')

役に立ちましたか?