【HTTP】headerにアンダースコアは使えない

任意のヘッダーを送信したのに、受け取り側でヘッダーが消えていると言うことはないでしょうか?

最近、カスタムヘッダーを設計して使う機会があったのですが、受け取り側のサーバーでヘッダーが取得できない状況になりました。
原因を探っていくと、どうやらヘッダー名にアンダースコア( _ )を使っていた事が原因でした。

では、そもそもどんな文字列なら扱えるのでしょうか?
今回は、HTTPのheaderに纏わる事についてご紹介します。

headerで使える文字について

結論から言うと、ASCII印字可能文字に含まれる文字を使用する事ができます。

ja.wikipedia.org

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の場合は設定次第でアンダースコアを使うことができます。  

www.nginx.com

参考

stackoverflow.com

stackoverflow.com

©︎2017-2018 WebSandBag