社内研修「HTTPから学ぶTCP/IP基礎」(2)

前回から引き続き、HTTPリクエストのメッセージヘッダについて説明します。
普通にブラウザを使ってインターネットをしているときは、ブラウザが自動的に設定しますし、リクエストの内容も見えませんので意識することがないと思います。
ただ、ヘッダの内容によって、Webアプリケーションの動作やWebサーバからのレスポンスが変わってくるため、Webアプリケーションエンジニアにとってはしっかりと理解しておく必要があります。
まず、サンプルを見てみます。
httpreq0
ヘッダフィールドとフィールド値を”:”で区切ったものが複数行あります。
また、改行はCRLFと決まっています。
リクエストで使用する主要なヘッダフィールドについて個別に見ていきます。

Host

HTTP1.1から追加された、リクエストヘッダで唯一の必須で設定しなければならないヘッダフィールドです。
開始行と合わせると、HTTPリクエストの最小構成は以下のようになります。
GET / HTTP1.1
Host:www.ois-yokohama.co.jp

本当に 必須かどうかコマンドプロンプトからtelnetコマンドで試してみましょう。
telnetがインストールされていない場合は、コントロールパネルの「プログラムと機能」から「Windowsの機能の有効化または無効化」をクリックすると機能一覧が出てきますので、「Telnetクライアント」にチェックを入れてください。
それではまず、telnetでOISのWEBサーバと接続します。
telnet www.ois-yokohama.co.jp 80
httpreq1
接続すると、画面に何も表示されなくなりますので、ローカルエコーを有効にします。
ローカルエコーは送信した文字を画面に表示する機能です。
CTRL+]を押し、
set localecho[enter]
で、ローカルエコーが有効になります。もう一度[enter]を押すと、元の表示に戻ります。
httpreq2
さっそく、HTTPリクエストを送ってみます。
開始行と、必須のヘッダフィールドであるHostを入力し、[enter]を2回押します。
httpreq3
Webサーバからレスポンスが返ってきました。
1行目に「200 OK」とありますので、成功したことが分かります。
httpreq4
次にHostヘッダを送らなかった場合です。開始行のみ送っています。
レスポンスに「400 Bad Request」と返ってきており、失敗したことが分かります。
やはりHostは必須ということが分かりました。

httpreq5

Hostが必須の理由

なぜHostが必須かというと、Webサーバが持っている機能である、バーチャルホストに対応するためです。
バーチャルホストは、一つのサーバ上で複数のドメインのWebサイトを稼働させることができます。
例えば、www1.ois-yokohama.co.jpとwww2.ois-yokohama.co.jpの2つのドメインで異なるWebサイトを運営している場合を考えます。
その場合、開始行の
GET /index.html HTTP/1.1
だけでは、Webサーバはどちらのindex.htmlを返せばよいか分かりません
そのため、Webサーバは、Hostヘッダで、どちらのindex.htmlを返せばよいかを判定しています。
第2回は以上です。
牛歩のように遅々として進みませんが、次回も引き続きHTTPリクエストのメッセージヘッダについて説明します。