任意のヘッダーを送信したのに、受け取り側でヘッダーが消えていると言うことはないでしょうか?
最近、カスタムヘッダーを設計して使う機会があったのですが、受け取り側のサーバーでヘッダーが取得できない状況になりました。
原因を探っていくと、どうやらヘッダー名にアンダースコア( _ )を使っていた事が原因でした。
では、そもそもどんな文字列なら扱えるのでしょうか?
今回は、HTTPのheaderに纏わる事についてご紹介します。
目次
headerで使える文字について
結論から言うと、ASCII印字可能文字に含まれる文字を使用する事ができます。
HTTP/2のrfc7540には次のように書かれています。
HTTP/1.x のようにヘッダーフィールド名は、大文字小文字を区別しない方法で比較される ASCII の文字列です。
しかしながら HTTP/2 では、ヘッダーフィールド名はエンコード前に小文字に変換されなければなりません (MUST)。
大文字のヘッダーフィールド名を含むリクエストやレスポンスは不正な形式 (8.1.2.6節) として扱わなければなりません (MUST)。
summerwind.jp
(有志の日本語訳を参考にさせていただきました。 )
ここで言うASCIIの文字列と言うのは、ASCII印字可能文字の事を指します。
ASCII印字可能文字はアンダースコアを含んでいる?
実は、ASCII印字可能文字にアンダースコアが含まれています。
そのため、仕様上はアンダースコアを使っても問題ないはずです。
では、何故使えないのでしょうか?
この理由について、正式な文章は見つかりませんでした。
しかし関連する話が見つかりました。
話を掻い摘んでまとめると次のような状態のためです。
- HTTPの仕様上は、ASCII印字可能文字であるアンダースコアは禁止にしていない
- Webサーバーでは、過去にヘッダーに含まれるアンダースコアを、ダッシュ( – )に変換していた歴史がある
- Webサーバーの独自仕様なので潜伏する問題があるかもしれない
技術的には最新のWebサーバーでアンダースコアを許可する事は可能なようです。
しかし、過去のWebサーバーで動いている環境を考慮してアンダースコア自体を使わないようにしているようです。
今後も、特に理由がなければアンダースコアを使わずダッシュを使った方が良いかもしれません。
NGINXでheaderにアンダースコアを使う
前述しましたが、アンダースコア自体は禁止されていません。
NGINXの場合は設定次第でアンダースコアを使うことができます。