telnetをHTTPクライアントとして使い、HTTPサーバーとの通信を体験します。

 WebブラウザとWebサーバーのデータのやり取りは通常,ユーザーが見えないところで行われています。しかし,telnetと呼ばれる通信アプリケーションを利用することで,実際にHTTPによる通信内容を見ることができます。

 telnet*1は,遠隔地にあるホストをネットワークを介して操作できるアプリケーションです。遠隔地からサーバーを操作するときなどに使われます。

 telnetでポート番号を指定することで,そのポートに対応したサービスを操作できます。例えば,ポート番号80を指定すればWebサーバーとやり取りできるわけです。

 実際にtelnetでWebサーバーに接続し,HTTPでデータのやり取りを行ってみましょう。telnetでWebサーバー(ポート番号80)に接続するには,次のように入力します。

$ telnet ホスト名 80

 ローカル・ホスト上のWebサーバーに接続するには,

$ telnet localhost 80

と入力します。接続が成功すると「Connected to <ホスト名>」のようにメッセージが表示されます。このメッセージが表示されたら,HTTPを利用してWebサーバーと通信できます。

 まず,ドキュメント・ルート上にあるindex.htmlファイルを取得してみましょう(図1)。始めにリクエスト・ラインを入力します。ページを取得したいのでメソッドには「GET」を利用します。URIはドキュメント・ルート上のindex.htmlなので「/index.html」となります。この際,「http://localhost/index.html」と指定しても構いません。プロトコルには,「HTTP/1.1」と指定します。入力ができたら[Enter]キーを押します。

図1●実際にHTTPでWebページを入手する
図1●実際にHTTPでWebページを入手する
telnetを利用してWebサーバーにindex.htmlファイルの内容を入手するようリクエストする。Webサーバーからはリクエストに応じてレスポンスが返ってくる。
[画像のクリックで拡大表示]

 次に,ヘッダーを記述します。HTTP 1.1では必ずHostヘッダーを指定する必要があります。Hostは取得したいコンテンツのあるホスト名を指定します。今回は,「localhost」となります。

 これで,ヘッダーの入力は完了です。次に空行を入れるため,[Enter]キーを押します。

 すると,Webサーバーはレスポンスを送信し,画面上にその内容が表示されます。レスポンスの最初の行にはステータス・ラインが表示されます。「HTTP/1.1 200 OK」と表示され,正常にデータを取得できたことが分かります。

 次の行から空行までがヘッダーです。例えば,「Date」はレスポンスした日時,「Server」はWebサーバーで利用しているアプリケーションの名称とバージョン,「Content-Type」にはメッセージ・ボディーの種類や文字コードを記入します。

 空行の後は,Webページの本体(HTML)が続きます。

 試しに,ファイルが存在しないURIにアクセスすると,「404 Not Found」が送られてきます。また,更新されていないファイルに対し,「If-Modified-Since」を用いて現在の時刻を指定してみましょう(図2)。

図2●ヘッダーを追加してHTTP通信を行う
図2●ヘッダーを追加してHTTP通信を行う
他のヘッダーを追加してもリクエストできる。図は指定した日時よりも後に更新されている場合にデータを送信する「If-Modified-Since」ヘッダーを付加した例。
[画像のクリックで拡大表示]

If-Modified-Since: Sun, 8 Oct 2006 00:00:00 GMT

 すると,レスポンスは「304 Not Modified」と表示され,ページの内容が送られてきません。これは,指定した時間より後にページが更新された場合にページ内容を取得するように指定しているからです。

 このように,リクエストによってレスポンスはさまざまです。いろいろと試してHTTPでのやり取りを体験してみましょう。

メソッドを制限する<Limit>

 公開するWebページのアクセス権限は,設定ファイル(Fedora 8の場合は,http.conf)の<Directory>項目の中の<Limit>および<LimitExcept>に記載できます(図3)。

図3●メソッドを制御する<Limit>,<LimitExcept>
図3●メソッドを制御する<Limit>,<LimitExcept>
<Limit>,<LimitExcept>で指定したメソッドを制御できる。図は一般ユーザーの公開用ディレクトリに記述されている<Limit>の利用例。

 これらは指定したメソッドを制御するときに使います。例えば,DELETEメソッドをユーザーが利用できないようにする,GETメソッドを認証に成功したユーザーのみが利用できるようにする,などです。ただし,特別な理由がない限り,<Limit>でメソッドを制限する必要はありません。

 それでも必要に迫られた場合には,次の点に注意して設定します。

 <Limit>は指定したメソッドを制御します。例えば,<Limit GET POST OPTIONS>と指定すればGET*2,POST,OPTIONSを制御します。

 逆に<LimitExcept>は,指定していないメソッドを制御します。例えば,<LimitExcept GET POST OPTIONS>と指定すれば,GET,POST,OPTIONS以外のメソッドを制御するわけです。

 図3中では,<Limit>に「Allow from all」と設定しており,GET,POST,OPTIONSをすべての接続者に対して許可しています。<LimitExcept>では「Deny from all」となっているため,GET,POST,OPTONS以外のメソッドを受け付けないようになっています。

 <Limit>を利用する場合,Limitは指定したメソッドのみを制御し,他のメソッドについては何も制御しないことに注意しましょう。例えば,認証が必要なディレクトリに対して,認証が成功したユーザーだけがGETメソッドを利用できるように,

<Limit GET>
    require valid-user
</Limit>

と設定したとします。こうすると,認証が成功したユーザー(valid-user)だけがGETを使えるようになります。しかし,他のメソッドについては何も制限されていません。認証が失敗したユーザーがPOSTなどのメソッドを利用できてしまいます。

 このような状況な問題が発生しないよう,図4のように<LimitExcept>を使って,そのほかのメソッドも制限しておきます。

図4●<Limit>で制限する場合の注意
図4●<Limit>で制限する場合の注意
<Limit>で一部のメソッドを制限する場合は,その他のメソッドについても制限を加えておく。