2024-2-1

Cloudflare Workersからのリクエストだけ308が返ってredirect loopに陥る

2日溶かした。

k8sのingress-controllerの下でサーバーを動かしていたところ、Cloudflare Workers経由のhttpsリクエストに対してだけ308を返す状況に陥った。 手元からcurlでhttpsリクエストを送るとちゃんと200が返ってきていて、何故かCloudflare Workersからfetchするときだけredirect loopに陥る。

原因

  • HTTPSを送っているつもりがHTTPでリクエストを送っていた。
  • https://で始まるURLを指定しても、CloudflareのEncryption Modeの設定次第ではhttpで送られる。

今回発生した事象の流れは以下の通り。

  1. Cloudflare Workersでfetch APIを使ってhttpsでデータを取得しようとする。
  2. Encryption Modeの設定がFlexになっているとプロトコルがhttpsからhttpに自動で変換される。
  3. k8sのIngressがリクエストを受け取るがhttpなのでhttpsにリダイレクトするよう308を返す。
  4. 2に戻るので無限ループ

同じ罠に嵌る人が多いのかGoogleで調べると上の方に公式のドキュメントが出てくるが、 k8s側の設定を疑っていてしっかり読んでいなかった。