リダイレクトループ

リダイレクト数 (Web)

[2] HTTPリダイレクトは、HTTP応答が新しい URL を指定してそちらにアクセスし直すよう求めるものですが、 これは何段にも重ねることができます。無限に繰り返されるものが無限リダイレクト、 うち特に循環によるものをリダイレクトループということがあります。

仕様書

リダイレクトへのリダイレクト

[535] は、リダイレクト先としてリダイレクトを返す URL を指定しても構いません。

[536] 利用者エージェントリダイレクトにより要求を改めて送信した結果がリダイレクトの場合も、 更にそのリダイレクトに従うことが期待されています。

リダイレクトの循環

[523] HTTP の仕様によると、 クライアントは、リダイレクトの循環を検出して対処するべきです >>518

[524] なぜ MUST でなく SHOULD なのか謎です。 無限リダイレクト無限ループするようなクライアントはどう考えてもバグっており、 有害でしかありません。

[8] HTTPリダイレクトの詳細な処理を規定していませんので、 「循環を検出」「対処」が具体的に何をどうすることなのかは定かではありません。

[9] WebブラウザーFetch Standard に従うことになっており、 HTTPリダイレクトの処理方法が厳密に規定されています。 Webブラウザー以外の HTTPクライアントも、 Fetch Standard の当該規定を (Webブラウザーにのみ適用可能な部分を読み飛ばすなど適当な読み替えの上で) 準用することで、Web互換性を確保できます。

[10] Fetch Standard によれば、 Webブラウザー入れ子の深さ20までのリダイレクトに対応することが求められています (>>7)。

要求のリダイレクト数

[3] 要求には redirect count (リダイレクト数) があります。 >>1

[4] リダイレクト数の初期値は 0 です。 >>1

[5] HTTP-redirect fetch は、要求リダイレクト数1 増加させます。 >>1

[6] HTTP-redirect fetch は、(増加させる前に) 要求リダイレクト数20 だと、ネットワークエラーを返します。 >>1

[7] つまり20個以上の深さの要求はできません。最初の要求1と数えます。 つまり認められるリダイレクトの回数は19です。

歴史

[525] RFC 2068リダイレクトを最大5回までとしており、注意が必要 >>518RFC 7231 は書いていました。