普段の現象には,基本的なWebアクセスのしくみでは説明できないものが数多くある。ここでは,Part1の知識から一歩踏み込んで,今どきのWebアクセスの真の姿を見ていこう。
データの種類がなぜわかるのか
返信メッセージに種類を明記だから「.html」でなくてもOK
WindowsなどのOSでは,ファイル名の最後に付くtxtやdocなどの部分を拡張子と呼び,これを判断材料にしてそのファイルを扱うアプリケーションを決めている。例えば,拡張子がdocのファイルはワープロ・ソフトのMicrosoft Wordと関連づけられており,そのファイルをダブル・クリックすると,Wordが起動してファイルを開く。
一方,Webページの多くは,URLが「.html」で終わっている。ということは,Webブラウザも拡張子でデータの種類を判断しているのだろうか。
しかし,html以外で終わるURLのWebページもけっこうある。jspや,asp,cgi,phpというのもある。Webブラウザは,こうした拡張子が付いたURLにアクセスしても,きちんとWebページを表示する(図2-1[拡大表示])。拡張子がhtmlでないURLにアクセスしても,WebブラウザはHTMLデータだと,どうしてわかるのだろうか。
よくよく考えてみると,WebブラウザがWebサーバーから受け取るデータはファイルではない。単なるデータなので名前はなく,拡張子も付いていない。とすると,Windowsのように拡張子で判断することもできない気がする。疑問は解消するどころか,ますます謎が深まってしまうばかりだ。
ヘッダーにデータの種類が書かれる
実は,Webブラウザは,受け取ったデータが画像なのかHTMLなのかを判断するのに,データといっしょに送られてくるContent-Type(コンテントタイプヘッダー)*という情報を使っている。つまり,Webブラウザは,Webサーバーから返信されてくるHTTPレスポンスのヘッダーを参照して,受信データの種類を判断するのである(図2-2[拡大表示])。
WebブラウザがWebサーバーから受け取るHTTPレスポンスには,サーバーでの処理結果を伝えるステータス行,補足情報を伝えるメッセージ・ヘッダー,Webページのデータが入るエンティティ・ボディの三つの部分がある。ここまでは,Part1の図1-4で確認したことだが,もう少し深くまでしくみを見てみると,メッセージ・ヘッダーの一つにContent-Typeヘッダーというものがある。実は,ここにデータの種類が記述されるのだ。
返信データがHTMLデータの場合,Content-Typeヘッダーは「Content-Type: text/html」となる。コロンの後ろにある「text/html」はメディア・タイプと呼び,データの種類を表す。
このメディア・タイプは,スラッシュ(/)で前半部分と後半部分に区切られている。前半は大まかな種類を示すタイプ,後半はより詳細な分類を示すサブタイプという。「text/html」では,タイプがtextなのでテキスト・データであることがわかり,サブタイプがhtmlなのでHTMLデータとして扱うべきだとわかる。
画像の場合も同様である。GIF(ジフ)データの場合,メディア・タイプは「image /gif」になる。JPEG(ジェイペグ)データなら,「image/jpeg」となる。
Webサーバーが種類を決める
では,メディア・タイプはどのように決まるのか。視点をWebサーバー側に移して見ていこう。
Webサーバーは,Webブラウザのリクエストに「html」と付いているから,HTTPレスポンスのContent-Typeヘッダーを「text/html」にするわけではない。リクエストを自分のルールで解釈し,返信データの種類を決める。
Content-Typeヘッダーを付けるのは,Webサーバー・ソフト自身,あるいはWebサーバーが呼び出したプログラム*のどちらかになる(図2-3[拡大表示])。
Webサーバー・ソフトは,ブラウザからのHTTPリクエストを分析して,要求されたデータをどのように返信するかを判断する。例えば,要求されたデータが,サーバーのハードディスクにファイルとして保存されていれば,ファイルを読み出して,その中身を返信する。このケースでは(図2-3a),Webサーバー・ソフト自身がContent-Typeヘッダーを付ける。
どのようなメディア・タイプのヘッダーにするかは,Webサーバーが独自に判断する。多くの場合は,サーバーに保存されているファイルの拡張子ごとにメディア・タイプが関連づけられている。サーバー側で保存されているファイルの拡張子がhtmlやaspならメディア・タイプは「text/html」にするというように,あらかじめ設定ファイルに書き込まれているのだ。
プログラムがヘッダーを作る場合も
一方,Webブラウザから要求されたデータを作り出すために,ほかのプログラムに処理を依頼することもある(図2-3b)。このケースでは,処理を依頼されたプログラムが返信データだけでなく,Content-Typeヘッダーなども作成し,Webサーバーに渡す。Webサーバー・ソフトは,渡されたデータにステータス行だけを加えて,HTTPレスポンスをブラウザに返信する。
Content-Typeヘッダーに書く返信データの種類を一番よく知っているのは,返信データを作成した本人であるプログラム。だから,Content-Typeヘッダーもプログラム自身が作成する。
いずれの場合にせよ,返信データの種類はサーバー側で指定し,HTTPレスポンスに書き込まれるのである。