telnetをHTTPクライアントとして使い、HTTPサーバーとの通信を体験します。
WebブラウザとWebサーバーのデータのやり取りは通常,ユーザーが見えないところで行われています。しかし,telnetと呼ばれる通信アプリケーションを利用することで,実際にHTTPによる通信内容を見ることができます。
telnet*1は,遠隔地にあるホストをネットワークを介して操作できるアプリケーションです。遠隔地からサーバーを操作するときなどに使われます。
telnetでポート番号を指定することで,そのポートに対応したサービスを操作できます。例えば,ポート番号80を指定すればWebサーバーとやり取りできるわけです。
実際にtelnetでWebサーバーに接続し,HTTPでデータのやり取りを行ってみましょう。telnetでWebサーバー(ポート番号80)に接続するには,次のように入力します。
|
ローカル・ホスト上のWebサーバーに接続するには,
|
と入力します。接続が成功すると「Connected to <ホスト名>」のようにメッセージが表示されます。このメッセージが表示されたら,HTTPを利用してWebサーバーと通信できます。
まず,ドキュメント・ルート上にあるindex.htmlファイルを取得してみましょう(図1)。始めにリクエスト・ラインを入力します。ページを取得したいのでメソッドには「GET」を利用します。URIはドキュメント・ルート上のindex.htmlなので「/index.html」となります。この際,「http://localhost/index.html」と指定しても構いません。プロトコルには,「HTTP/1.1」と指定します。入力ができたら[Enter]キーを押します。
図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通信を行う 他のヘッダーを追加してもリクエストできる。図は指定した日時よりも後に更新されている場合にデータを送信する「If-Modified-Since」ヘッダーを付加した例。 [画像のクリックで拡大表示] |
|
すると,レスポンスは「304 Not Modified」と表示され,ページの内容が送られてきません。これは,指定した時間より後にページが更新された場合にページ内容を取得するように指定しているからです。
このように,リクエストによってレスポンスはさまざまです。いろいろと試してHTTPでのやり取りを体験してみましょう。
メソッドを制限する<Limit>
公開するWebページのアクセス権限は,設定ファイル(Fedora 8の場合は,http.conf)の<Directory>項目の中の<Limit>および<LimitExcept>に記載できます(図3)。
図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メソッドを利用できるように,
|
と設定したとします。こうすると,認証が成功したユーザー(valid-user)だけがGETを使えるようになります。しかし,他のメソッドについては何も制限されていません。認証が失敗したユーザーがPOSTなどのメソッドを利用できてしまいます。
このような状況な問題が発生しないよう,図4のように<LimitExcept>を使って,そのほかのメソッドも制限しておきます。
図4●<Limit>で制限する場合の注意 <Limit>で一部のメソッドを制限する場合は,その他のメソッドについても制限を加えておく。 |