web-dev-qa-db-ja.com

カスタムHTTPヘッダ:命名規則

私たちのユーザーの何人かは私たちが彼らに送る要求の HTTPヘッダ 、あるいは私たちのAPIから得た応答にさえ彼らのアカウントに関連するデータを含めるように私たちに頼みました。 ネーミング format ...などの点で、カスタムHTTPヘッダーを追加するための一般的な規則は何ですか。

また、あなたがウェブ上でつまずいたこれらのスマートな用法を自由に投稿してください。私たちは、ターゲットとしてそこに最高のものを使ってこれを実装しようとしています:)

968

2012年6月、 RFC 6648 のように、「X-」プレフィックスを使用することの推奨が廃止されました。以下に関連性の引用を示します。

3.新しいパラメーターの作成者向けの推奨事項

...

  1. パラメータ名の前に「X-」または同様の構成要素を付けないでください。

4.プロトコル設計者向けの推奨事項

...

  1. 「X-」プレフィックスまたは同様の構成要素を持つパラメータの登録を禁止しないでください。

  2. 「X-」プレフィックスまたは同様の構成要素を持つパラメータは、標準化されていないものとして理解する必要があることを規定してはなりません。

  3. 「X-」プレフィックスまたは同様の構成要素のないパラメータは、標準化されていると理解する必要があることを規定してはなりません。

「SHOULD NOT」(「discouraged」)は「MUST NOT」(「forbidden」)と同じではないことに注意してください。これらのキーワードの別の仕様については RFC 2119 も参照してください。つまり、「X-」プレフィックス付きヘッダーを使用し続けることができますが、推奨されておらず、あたかもそれらが公開標準であるかのようにドキュメント化することはできません。


2011年6月に、最初の IETFドラフトdeprecateに投稿されました。標準ヘッダー。その理由は、「X-」で始まる非標準ヘッダーが標準になると、「X-」プレフィックスを削除すると下位互換性が失われ、アプリケーションプロトコルが両方の名前をサポートするように強制されるためです(たとえば、x-gzipgzipは同等になります) 。そのため、「X-」プレフィックスなしでsensiblyと名前を付けることをお勧めします。


推薦  wasは、名前を「X-」で始めます。例えば。 X-Forwarded-ForX-Requested-With 。これはa.oにも記載されています。 RFC 2047 のセクション5。

1073
BalusC

質問は再読に値する。実際に質問されるのは、将来を保証し、ベンダーのサポートや公式の標準について考えることが適切であるCSSプロパティのベンダープレフィックスとは似ていません。実際に尋ねられる質問は、URLクエリパラメータ名を選択することに似ています。だれも気にしないでください。しかし、カスタムの名前空間は、完全に有効であり、しかも一般的で正しいものです。

理論的根拠:
これは、カスタムのアプリケーション固有のヘッダに関する開発者間の慣習 - "アカウントに関連するデータ"についてのものです - ベンダー、規格とは無関係です。ただし、問題の開発者が、サーバー、プロキシ、またはクライアントによる他の意図された用途を持つ可能性のあるヘッダー名を単に回避する必要がある点を除いて、第三者によって実装される組織またはプロトコル。このため、 "X-Gzip/Gzip"と "X-Forwarded-For/Forwarded-For"の例は議論の余地があります。提起された問題は、URLクエリパラメータの命名規則に似た、プライベートAPIのコンテキストでの規則についてです。それは好みと名前空間の問題です。 "X-ClientDataFoo"が "X"なしで任意のプロキシまたはベンダによってサポートされていることに関する懸念は明らかに見当違いです。

"X-"接頭辞について特別なものや魔法のようなものは何もありませんが、それがカスタムヘッダであることを明確にするのに役立ちます。実際、RFC-6648他は "X-"接頭辞の使用のケースを強化するのを助けます、なぜなら - HTTPクライアントとサーバのベンダーが接頭辞を放棄するので - あなたのアプリ特有の、プライベートAPI、個人データ - Passing-mechanismは、少数の正式な予約済みヘッダー名との名前空間の衝突に対して、さらによく隔離されています。とは言っても、私の個人的な好みや推奨はさらに一歩進んで"X-ACME-ClientDataFoo"(ウィジェット会社が "ACME"の場合).

IETF仕様は、まったく異なるユースケースを区別することができないため、OPの質問に答えるには具体的ではありません。(A)ベンダーが一方で "Forwarded-For"のような新しいグローバル対応機能を導入アプリ開発者がクライアントとサーバーとの間でアプリ固有の文字列をやり取りする。仕様は前者(A)とのみ関係します。ここでの問題は、(B)の規約があるかどうかです。がある。それらはパラメータをアルファベット順にまとめ、それらをタイプ(A)の多くの規格関連ヘッダから分離することを含みます。 "X - "または "X - ACME - "接頭辞の使用は(B)にとって便利で合法的であり、(A)と衝突しません。より多くのベンダーが(A)に "X-"を使用するのをやめるほど、(B)はより明確に区別されます。

例:
Google(さまざまな標準化団体でちょっとした重みを持っている)は、今日の私の答えでは、20141102現在のバージョンを示すために "X-Mod-Pagespeed"を使っています。彼らのApacheモジュールは与えられたレスポンスを変換することに関わっていました。誰かが本当に "X-"なしで "Mod-Pagespeed"を使うべきであるとか、あるいはその使用を祝福するようにIETFに依頼するべきだと示唆している人はいますか?

サマリー:
サーバーとの間でデータをやり取りするためにアプリ内でカスタムのHTTPヘッダー(Cookieの代わりに適切な代替手段として)を使用しており、これらのヘッダーが明示的に使用されることはありません。アプリケーションのコンテキストでは、名前の前後に "X-"または "X-FOO-"を付けるのが妥当で一般的な規則です。

481
cweekly

HTTPヘッダーのフォーマットはHTTP仕様で定義されています。 HTTP 1.1について話します。仕様は RFC 2616 です。セクション4.2「メッセージヘッダ」では、ヘッダの一般的な構造が定義されています。

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

この定義は、トークンとTEXTという2つの主要な柱に基づいています。どちらもセクション2.2「基本規則」で定義されています。トークンは:

   token          = 1*<any CHAR except CTLs or separators>

次に、CHAR、CTL、および区切り文字に基づいて休止します。

   CHAR           = <any US-ASCII character (octets 0 - 127)>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

TEXTは以下のとおりです。

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

ここで、LWSは線形空白で、その定義は再現しません。また、OCTETは次のとおりです。

   OCTET          = <any 8-bit sequence of data>

定義に付随する注意があります。

The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].

それで、2つの結論。まず、ヘッダーnameはASCII文字のサブセット(英数字、句読点など)で構成されている必要があります。次に、ヘッダーのvalueの定義に、それをASCIIに制限したり、8ビット文字を除外したりすることはありません。明示的にオクテットで構成されています。 LFはコントロールと見なされます)。さらに、TEXTプロダクションに対するコメントは、オクテットはISO-8859-1にあるものとして解釈されるべきであり、そのエンコーディングの外側の文字を表すためのエンコーディングメカニズム(ひどいことに、恐ろしい)があることを意味します。

そのため、特に@BalusCに対応するために、仕様に従ってヘッダー値がISO-8859-1にあることは明らかです。 Tomcatのヘッダで高8859-1文字(特にフランス語で使用されているアクセント記号付きの母音)を送信し、それらをFirefoxで正しく解釈してもらったので、ある程度までは、これは実際には理論的にも同様に機能します。 (これはURLを含むLocationヘッダーであり、これらの文字はURLでは無効です。したがって、これは実際には無効でしたが、別の規則に従っています。).

とは言っても、私はISO-8859-1がすべてのサーバー、プロキシ、そしてクライアントにまたがって動作することに頼るのではないので、私は防御プログラミングの問題としてASCIIに固執するでしょう。

60
Tom Anderson

adding追加のHTTPヘッダーの変更、またはより正確な変更は、他に何もなければ素晴らしいコードデバッグツールです。

URLリクエストがリダイレクトまたは画像を返す場合、デバッグコードの結果を一時的に書き込むHTML「ページ」はありません-少なくともブラウザに表示されるものはありません。

1つの方法は、データをローカルログファイルに書き込み、後でそのファイルを表示することです。もう1つの方法は、デバッグされるデータと変数を反映するHTTPヘッダーを一時的に追加することです。

X-fubar-somevar:やX-testing-someresult:のような追加のHTTPヘッダーを定期的に追加して、物事をテストします。そうでなければ、追跡が非常に困難だった多くのバグを発見しました。

16
g1smd

ヘッダフィールド名レジストリは RFC3864 で定義されています、そして "X-"で特別なことは何もありません。

私が言える限りでは、プライベートヘッダに関するガイドラインはありません。疑い、それらを避けなさい。あるいはHTTP Extension Framework( RFC 2774 )を見てください。

もっとユースケースを理解するのは面白いでしょう。メッセージ本文に情報を追加できないのはなぜですか?

15
Julian Reschke

RFC6648 あなたは、あなたのカスタムヘッダが「標準化され、公開され、一般的に展開され、あるいは複数の実装にわたって使用可能になるかもしれない」と仮定することを勧めます。したがって、 "X - "または同様の構成要素を接​​頭辞として付けないことをお勧めします。

ただし、例外があります。「[あなたのヘッダ]が標準化される可能性が極めて低い場合」。このような「実装固有および私用」ヘッダーについては、RFCはベンダープレフィックスなどの名前空間が正当化されると言います。

11
Edward Brey