ITの窓辺から

三流IT技術者の日常

プロキシサーバ経由の宛先とHTTP Hostヘッダ

今回の記事はいつにも増して基本的な話になっています。あまりに基本すぎて拍子抜けするかもしれませんが・・・、HTTPにあまり馴染みがない人だとなめらかに説明できないのではないでしょうか。

宛先URIと名前解決

クライアントからWebサーバへのHTTP通信パケットをキャプチャすると以下のような内容になります。

f:id:ReaLiZeZNSG:20180808000103p:plain

PCからこのブログにアクセスした時のものです。
HTTPメソッドとしてGETが使用されており、宛先Webサーバのルートディレクトリのindex.htmlを要求しています。宛先WebサーバはDNSによる名前解決が行われて宛先が明確になっているためGETで指定するURIは相対URIで指定することになります。

一方、以下の画像はプロキシサーバ経由でWebサーバにアクセスした時のキャプチャです。

f:id:ReaLiZeZNSG:20180808001636p:plain

先ほどと異なりGETメソッドの宛先URI絶対パスになっています。
プロキシサーバを経由する場合、クライアントはWebサーバへのアクセスをプロキシサーバに代行してもらう形になるため、宛先URIを完全に指定してあげないとプロキシサーバはどのWebサーバにアクセスして良いのかわかりません。すなわち、渡されたURIに対する名前解決はクライアントではなくプロキシサーバにより行われます。テストに出るので覚えておきましょう。

Hostヘッダ

HostヘッダはHTTP1.1において唯一必須のHTTPヘッダです。宛先Webサーバ名を格納します。先程の画像を見ると、直接アクセスとプロキシ経由のアクセス両方でHostヘッダに同じ値が格納されています。先程プロキシサーバ経由の場合、プロキシサーバは宛先Webサーバがどこかわからないので絶対URIで指定すると書きました。

しかしHostヘッダにWebサーバの名前が書いてあります。ここに宛先書いてあるじゃん、と思うかもしれませんが、残念ながらHostヘッダに書かれている内容は名前解決には利用できません。名前解決に使えるのはあくまでHTTPリクエストラインに書かれている宛先URIのサーバ名だけです。

ちなみにHostヘッダの用途は、HTTPリクエストを受け取ったWebサーバに宛先FQDNを知らせることです。Apache等のWebサーバにはバーチャルホストという機能があり、この機能を使うと同一Webサーバ内に複数のURIを持たせることができます。バーチャルホストを使用している場合に、そのHTTPリクエストがどのバーチャルホスト宛に来たのかWebサーバはHostヘッダの値を参照して把握します。

次のHTTPに関する記事ではHTTPS通信の復号化について触れていこうと思います。恐らく最近トレンドになっている機能だと思います。色々準備が必要なので週明けとかになりそうですかね。