図2-1 URLに「.html」がなくてもWebページは表示される<BR>URLの拡張子がhtmlとなっていなくても,きちんとWebページが表示される。
図2-1 URLに「.html」がなくてもWebページは表示される<BR>URLの拡張子がhtmlとなっていなくても,きちんとWebページが表示される。
[画像のクリックで拡大表示]
図2-2 ブラウザはサーバーが返す情報に従ってデータを扱う&lt;BR&gt;Webサーバーからの返信データはデータの種類を示した「メディア・タイプ」とともに送られてくる。Webブラウザは,これに従ってデータを扱う。
図2-2 ブラウザはサーバーが返す情報に従ってデータを扱う<BR>Webサーバーからの返信データはデータの種類を示した「メディア・タイプ」とともに送られてくる。Webブラウザは,これに従ってデータを扱う。
[画像のクリックで拡大表示]
図2-3 Webサーバーは自分のルールで返信データを決める&lt;BR&gt;Webブラウザがリクエストで指定するデータは,ハードディスクにあるファイルそのものとは限らない。プログラムを指定している場合もある。
図2-3 Webサーバーは自分のルールで返信データを決める<BR>Webブラウザがリクエストで指定するデータは,ハードディスクにあるファイルそのものとは限らない。プログラムを指定している場合もある。
[画像のクリックで拡大表示]

普段の現象には,基本的な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レスポンスに書き込まれるのである。