HTTP Link ヘッダ (RFC 8288) パーサ | link-value を分解して rel とパラメータを一覧化
HTTP レスポンスの Link ヘッダ 1 行を貼り付けると、カンマ区切りの link-value に分け、それぞれを <URI>・rel トークン・title などのパラメータへ分解する。引用符内や <> 内のカンマを誤って区切らない quote-aware なトークナイザを使う。
💡 このツールについて
REST API のページング、preload / preconnect のリソースヒント、alternate の hreflang。Link ヘッダは 1 行に複数の link-value を詰め込むため、目視では rel="next" と rel="prev" のどちらがどの URI に紐づくのか追いにくい。とくに URI のクエリ文字列に & や , が混ざる、title の引用符の中にカンマが入る、といったケースでは、単純な split(',') では壊れる。
このパーサは RFC 8288 セクション 3 の文法 link-value = "<" URI ">" *( OWS ";" OWS link-param ) に沿って分割する。まず最上位のカンマで link-value に分け、その際 <> の深さと引用符の内外を数えて、URI 内・引用文字列内のカンマは区切り扱いしない。次に各 link-value をセミコロンで link-param に割り、name=value または name="quoted" を取り出す。引用文字列内のバックスラッシュエスケープは剥がして値に格納する。結果は link-value 数・rel トークン総数・ユニーク rel 数・パラメータ総数の 4 集計と、per-link カード(rel をチップ、その他パラメータを key = value 表示)で確認できる。
🧐 よくある質問
Q. rel に複数の値が入っているとどうなりますか。
A. rel="prev next" のように空白区切りで複数トークンを書けます。各トークンを個別のチップに分け、rel トークン総数とユニーク rel 数の両方に反映します。
Q. title の引用符の中にカンマがあっても大丈夫ですか。
A. はい。title="Page 2, draft" のように引用文字列内にカンマがあっても、link-value の区切りとは扱いません。引用符の内外を判定してから分割します。
Q. URI のクエリに ; や , が含まれていても壊れませんか。
A. URI は < と > で囲まれた範囲をそのまま 1 つの URI として取り出すため、その内側の記号は分割に影響しません。
Q. 複数の link-value で一部だけ書式が崩れている場合は。
A. <URI> の開始 < が見つからない link-value は集計から除外し、残りの正常な link-value の解析を続けます。
Q. 入力に上限はありますか。 A. Link ヘッダは 20000 文字以内です。超過するとエラーを表示します。
📚 豆知識
Link ヘッダは HTML の <link> 要素を HTTP ヘッダ側へ持ち出した仕組みで、RFC 5988 を経て現在は RFC 8288 が標準。ページングの rel="next" / rel="prev" は GitHub API などが採用し、HTTP/2 時代には rel="preload" がブラウザの先読みヒントとして広まった。rel の値は IANA の Link Relation Types レジストリで管理されており、alternate・canonical・stylesheet といった定義済みトークンに加えて、絶対 URI を rel に書く拡張も認められている。