HTTP入門

目次

HTTPとは?

HTTP(HyperText Transfer Protocol)は、Web のサーバと、クライアント(ブラウザ)の間で、ウェブページを送受信するためのプロトコルです。基本的にはテキストメッセージを交換することにより、実現されています。

HTTPのサンプル

ブラウザで Webページを開く際、ブラウザはサーバに下記のような要求メッセージを送信します。

HTTP
GET / HTTP/1.1
Accept: image/gif, image/jpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive

これに対してサーバは下記のような応答メッセージを返します。

HTTP
HTTP/1.1 200 OK
Date: Sun, 11 Jan 2004 16:06:23 GMT
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT
ETag: "1dba6-131b-3fd31e4a"
Accept-Ranges: bytes
Content-Length: 4891
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

<!DOCTYPE html>
<html>
  :
</html>

メッセージ構文

要求メッセージは、次の構文から構成されます。

HTTP
GET / HTTP/1.1   リクエスト行
Accept: image/gif, image/jpeg, */*     ヘッダ
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive
空行
メッセージボディ(POSTメソッドなどで使用)

応答メッセージは、次の構文から構成されます。

HTTP
HTTP/1.1 200 OK    レスポンス行
Date: Sun, 11 Jan 2004 16:06:23 GMT     ヘッダ
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT
ETag: "1dba6-131b-3fd31e4a"
Accept-Ranges: bytes
Content-Length: 4891
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
空行
<!DOCTYPE html>        メッセージボディ
<html>
  :
</html>

改行コードは Windows 形式の CR LF("\r\n")です。1行目に リクエスト行 または レスポンス行 があり、次に ヘッダ が数行あり、次に空行が1行あり、次にメッセージボディが複数行あります。

リクエスト行

リクエスト行は下記の書式で表します。

リクエスト行
メソッド パス名 HTTP/バージョン

パス名は通常、/aaa/bbb/ccc.html のような、スラッシュで始まるパス名や、http:// などで始まる URL が指定されます。バージョンは現在は 1.1 が主流です。

レスポンス行

レスポンス行は下記の書式で表します。

レスポンス行
HTTP/バージョン ステータス番号 補足メッセージ

補足メッセージには、OK や Not Found など、ステータス番号の意味や詳細を補足するメッセージが返されます。

メソッド

HTTP/1.0、HTTP/1.1 でサポートされているメソッドを下記に示します。

メソッド HTTP 説明
1.0 1.1
GET 最も一般的に使用されるメソッドです。ブラウザはサーバに対してページの取得を要求します。
ヘッダのみの情報を要求します。サーバは GET メソッドと HEAD メソッドは必ずサポートしなければなりません。
POST CGI でよく使用されるメソッドです。method="POST" を指定したフォームに入力したデータをサーバに転送する際に使用されます。
PUT ファイルをサーバにアップロードする際に用いられます。
DELETE 指定したリソースを削除することをサーバに要求します。
CONNECT × プロキシサーバを経由して SSL 通信する際などに使用します。
OPTIONS × サーバがサポートしているメソッドやオプションを調べる際に用います。
TRACE × HTTP要求がどのプロキシサーバを経由して送信されるかなど、HTTP の動作をトレースする際に用います。このメッセージを受け取った最後のサーバは、要求メッセージに含まれるエンティティ(通常はヘッダ+メッセージボディ)をそのまま返します。
× 指定した URL とリソースにリンク関係を結びます。HTTP/1.1 では廃止されました。
× 指定した URL とリソースの間のリンク関係を解除します。HTTP/1.1 では廃止されました。
(◎:必須、○:サポート、×:未サポート)

Apache では上記の他にも PATCH、PROPFIND、PROPPATCH、MKCOL、COPY、MOVE、LOCK、UNLOCK などのメソッドをサポートしているようです。

ステータス番号

応答メッセージにはステータス番号が含まれます。

分類番号メッセージ説明
情報100Continue処理を継続しています。続きのリクエストを送信してください。
101Switching ProtocolsUpgrade ヘッダで指定したプロトコルに変更して再要求してください。
成功200OK成功しました。
201CreatedLocation ヘッダで指定した場所に新しいコンテンツが作成されました。
202Accepted要求は受理されました。ただし処理は完了していません。
203Non-Authoritative Information応答ヘッダはオリジナルサーバーが返したものとは異なりますが、処理は成功です。
204No Contentコンテンツはありませんが、処理は成功しました。
205Reset Content要求を受理したので、現在のコンテンツ(画面)を破棄してください。。
206Partial Contentコンテンツを一部のみ返却します。
転送300Multiple Choicesコンテンツ入手方法について複数の選択肢があります。
301Moved PermanentlyLocation ヘッダで指定された別の場所に移動しました。
302FoundLocation ヘッダで指定された別の場所に見つかりました。そちらを見てください。
303See OtherLocation ヘッダで指定された他の場所を見てください。
304Not Modified更新されていません。If-Modified-Since ヘッダを用いた場合に返却されます。
305Use ProxyLocation ヘッダで指定したプロキシを使用してください。
306(Unused)未使用。
307Temporary Redirect別の場所に一時的に移動しています。
クライアントエラー400Bad Request要求が不正です。
401Unauthorized認証されていません。
402Payment Required支払いが必要です。
403Forbiddenアクセスが認められていません。
404Not Found見つかりません。
405Method Not Allowed指定したメソッドはサポートされていません。
406Not Acceptable許可されていません。
407Proxy Authentication Requiredプロキシ認証が必要です。
408Request Timeoutリクエストがタイムアウトしました。
409Conflictリクエストがコンフリクト(衝突・矛盾)しました。
410Gone要求されたコンテンツは無くなってしまいました。
411Length RequiredContent-Length ヘッダを付加して要求してください。
412Precondition FailedIf-... ヘッダで指定された条件に合致しませんでした。
413Request Entity Too Large要求されたエンティティが大きすぎます。
414Request-URI Too Long要求された URI が長すぎます。
415Unsupported Media Typeサポートされていないメディアタイプです。
416Requested Range Not Satisfiable要求されたレンジが不正です。
417Expectation FailedExpect ヘッダで指定された拡張要求は失敗しました。
サーバーエラー500Internal Server Errorサーバーで予期しないエラーが発生しました。
501Not Implemented実装されていません。
502Bad Gatewayゲートウェイが不正です。
503Service Unavailableサービスは利用可能ではありません。
504Gateway Timeoutゲートウェイがタイムアウトしました。
505HTTP Version Not SupportedこのHTTPバージョンはサポートされていません。

ヘッダ

カテゴリ 要求 応答 ヘッダ
一般ヘッダ Cache-Control, Connection, Date, Pragma, Trailer, Transfer-Encoding, Upgrade, Via, Warning
要求ヘッダ× Accept, Accept-Charset, Accept-Encoding, Accept-Language, Authorization, Expect, From, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Max-Forwards, Proxy-Authorization, Range, Referer, TE, User-Agent
応答ヘッダ× Accept-Ranges, Age, ETag, Location, Proxy-Authenticate, Retry-After, Server, Vary, WWW-Authenticate
要素ヘッダ Allow, Content-Encoding, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Type, Expires, Last-Modified, extension-header

Accept (要求)

ブラウザが受信可能なデータ形式(MIMEタイプ)をサーバに伝えます。アスタリスク(*)は「すべて」を意味します。下記は、ブラウザが GIF や JPEG、その他どんな形式のデータでも受信可能であることを示します。(→ Content-Type

Accept: image/gif, image/jpeg, */*

Accept-Charset (要求)

ブラウザが受信可能な文字セットをサーバに伝えます。下記は、ブラウザが iso-8859-5 と Shift_JIS のみを受信可能であることを示します。(→ Content-Type

Accept-Charset: iso-8859-5, Shift_JIS

Accept-Encoding (要求)

ブラウザが受信可能なエンコード方式をサーバに伝えます。例えば、ブラウザが gzip 形式をサポートしていることをサーバに伝え、サーバはメッセージボディを自動的に gzip 圧縮してブラウザに送り、ブラウザ側がこれを自動的に解凍して画面に表示します。こうした機構により、通信負荷を低減することが可能です。(→ Content-Encoding

Accept-Encoding: gzip, deflate

Accept-Language (要求)

ブラウザが受信可能な言語をサーバに伝えます。下記は、ブラウザが日本語のみを受信可能であることを意味します。(→ Content-Language

Accept-Language: ja

Accept-Ranges (応答)

Range 要求において使用可能な単位をクライアントに伝えます。現在定義されているのは bytes のみです。(→ RangeContent-Range

Accept-Ranges: bytes

Age (応答)

エンティティが生成されてからの予測経過時間(秒)を示します。下記の例では、このエンティティがおそらく、プロキシサーバで 30秒間程度保持されたもの、つまり、30秒程度古いデータであることを示します。

Age: 30

Allow (要求/応答)

要求URL で示すリソースに対して使用可能なメソッドの一覧を示します。下記の例では、このリソースに対して GET、HEAD、PUT メソッドを使用可能であることを示します。

Allow: GET, HEAD, PUT

Authorization (要求)

認証が必要なリソースに対して認証情報を伝えます。例えば、BASIC認証の場合は、Basic の文字と、ユーザ名とパスワードをコロン(:)で連結したものを BASE64 形式にエンコードしたものを転送します。(→ WWW-Authenticate

Authorization: Basic dGFuYWthOmhpbWl0c3U=

Cache-Control (要求/応答)

キャッシュに関する指示を表します。下記の例では、プロキシサーバやクライアントがこのリソースをキャッシュしてはならないことを示しています。HTTP/1.0 では Pragma: no-cache が使用されます。(→ Pragma

Cache-Control: no-cache

Connection (要求/応答)

HTTP/1.1 でサポートされた持続接続機能をブラウザがサポートしている場合、その旨を相手に伝えます。持続接続を用いることにより、1回の接続で複数のリクエスト/レスポンスを発行することが可能になります。

Connection: Keep-Alive

持続接続を完了する場合、サーバは close を返却します。

Connection: close

その他にも、サーバ・プロキシ間、プロキシ・クライアント間のような直接接続にのみ有効なヘッダの一覧を示すために用いられます。プロキシサーバはこのヘッダで指定されたヘッダ情報を削除して、転送しなくてはなりません。

Connection: Upgrade

Content-Encoding (要求/応答)

コンテンツのエンコード方式を示します。下記は、コンテンツが gzip 形式で圧縮されていることを示します。(→ Accept-Encoding

Content-Encoding: gzip

Content-Language (要求/応答)

コンテンツの言語を en(英語)、ja(日本語)などで示します。

Content-Language: ja

Content-Length (要求/応答)

コンテンツ(=メッセージボディ)の長さをバイト単位で示します。ヘッダとメッセージボディの間の改行のバイト数は除きます。

Content-Length: 4891

Content-Location (要求/応答)

コンテンツが別の URL でもアクセス可能なとき、そのエンティティの URL を絶対URL または相対URL で示します。(→ Location

Location: http://xxx.yyy.zzz/index.htm

Content-MD5 (要求/応答)

コンテンツが通信途中で改変されていないかをチェックするために、コンテンツに関するチェックデータ(128ビットのMD5ダイジェストをBASE64エンコードしたもの)を示します。

Content-MD5: GitH4qFa4GasgWxJs8ha5Q==

Content-Range (要求/応答)

相手に送信するコンテンツの範囲を示します。下記の例では、コンテンツ全体は 12345バイトあり、その中の 0バイト目から 999バイト目の部分を送信していることを示します。(→ RangeAccept-Ranges

Content-Range: bytes 0-999/12345

Content-Type (要求/応答)

コンテンツの種別を MIMEタイプで示します。下記は、コンテンツの内容がテキスト(HTML)形式であることを示します。

Content-Type: text/html

加えて、文字コード(Shift_JIS、euc-jp、ISO-2022-JP、UTF-8 など)を示すこともできます。

Content-Type: text/html; charset=Shift_JIS

Date (要求/応答)

応答を返す時刻を示します。曜日(Sun,)は省略可能です。日付は 1 でも 01 でも構いません。年は 2桁でも 4桁でも構いませんが 4桁が推奨されています。秒(:23)は省略可能です。時間帯は GMT(グリニッジ標準時)を用いることが多いようです。

Date: Sun, 04 Jan 2004 16:06:23 GMT

ETag (応答)

エンティティとそのバージョンを一意に識別する識別子を示します。識別子は、ファイル識別子やサイズ、更新時刻などの情報から計算されます。(→ If-MatchIf-None-MatchIf-Range

ETag: "1dba6-131b-3fd31e4a"

Expect (要求)

いろいろな目的で使用されます。

Expect: 100-continue

Expires (要求/応答)

エンティティの有効期限を示します。有効期限を過ぎたエンティティはキャッシュから削除されます。

Expires: Thu, 01 Dec 1994 16:00:00 GMT

From (要求)

この要求を行った人のメールアドレスを指定します。検索エンジンがロボットで探索する場合に、探索に関する問い合わせ先のメールアドレスを通知する際などに利用されます。

From: aaa@xxx.yyy.zzz

Host (要求)

HTTP/1.1 で唯一の必須ヘッダです。ブラウザからサーバに対して、サーバ名を送信します。サーバが名前ベースの仮想ホストをサポートしている場合、この名前を手がかりにどのサーバとして振舞うか決定されます。例えば、http://aaa.sample.dom/ と http://bbb.sample.dom/ は実は同じサーバ(IPアドレス:61.206.47.206)ですが、Host ヘッダでホスト名を指定することにより、仮想的に 2つのサーバとして振舞うことが可能になります。

Host: aaa.sample.dom

If-Match (要求)

指定した ETag にマッチする場合にのみ、メソッドを実行することをサーバに依頼します。(→ ETagIf-None-Match

If-Match: "1dba6-131b-3fd31e4a"

If-Modified-Since (要求)

クライアント側がすでにキャッシュを持っている場合、キャッシュの日付をサーバに通知し、「この日付よりも新しいものがあれば転送してくれ」と要求します。もし、更新されていなければサーバは 304(not modified)ステータスを返し、ブラウザはキャッシュしていたデータを表示します。(→ If-Unmodified-Since

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

If-None-Match (要求)

指定した ETag にマッチしない場合にのみ、メソッドを実行することをサーバに依頼します。(→ ETagIf-Match

If-None-Match: "1dba6-131b-3fd31e4a"

If-Range (要求)

クライアントが、エンティティの一部をすでに保持している場合に、「もし、この ETag で指定したエンティティの一部が最新のものであるならば、残りのすべてを、さもなくば全体を送信してくれ」の意味で要求します。Range ヘッダと組み合わせて使用します。(→ ETagRange

Range: bytes=0-1023
If-Range: "1dba6-131b-3fd31e4a"

If-Unmodified-Since (要求)

エンティティが、指定した日付よりもあとに更新されていなければ、要求を処理します。更新されている場合、サーバは 412(Precondition Failed)ステータスを返します。(→ If-Modified-Since

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Last-Modified (要求/応答)

エンティティが最後に更新された時刻を示します。(→ If-Modified-Since

Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT

Location (応答)

エンティティの場所が移動した場合など、ブラウザが要求した URL とは別の URL にジャンプさせたい場合に使用します。URL には http:// や https:// で始まる絶対URL を指定します。(→ Content-Location

Location: http://www.yyy.zzz/aaa.html

Max-Forwards (要求)

OPTIONS や TRACE メソッドにおいて、プロキシサーバの最大ホップ数を指定します。プロキシサーバはこの値をひとつ減算して、次のプロキシサーバに転送します。この値が 0 になると、プロキシサーバは最後の受信者として応答を返します。

Max-Forwards: 16

Pragma (要求/応答)

様々な目的で使用されます。例えば、下記はキャッシュを禁止する旨をプロキシサーバやクライアントに通知します。(→ Cache-Control

Pragma: no-cache

Proxy-Authenticate (応答)

プロキシサーバとクライアントの間で認証が必要であることを示します。(→ Proxy-AuthorizationWWW-Authenticate

Proxy-Authenticate: Basic realm="XXXXXX"

Proxy-Authorization (要求)

プロキシサーバとクライアント間の認証情報を渡します。(→ Proxy-AuthenticateAuthorization

Proxy-Authorization: Basic dGFuYWthOmhpbWl0c3U=

Range (要求)

クライアントからサーバに対して、エンティティの一部のみを要求します。下記の例では、ページの最初の 1000バイト(0バイト目から 999バイト目)のみを要求しています。(→ Accept-RangesContent-RangeIf-Range

Range: bytes=0-999

Referer (要求)

この要求の元となったページの URL(通常はリンク元のURL)を通知します。

Referer: http://xxx.yyy.zzz/index.html

Retry-After (応答)

数秒後に再度要求してくれという意味で、503(Service Unavailable)や 3xx(Redirection)ステータスとともに返されます。下記は、後120秒後に再要求してくれの意味を持ちます。Date: 形式の絶対時刻が返されることもあります。

Retry-After: 120

Server (応答)

サーバからブラウザに対してサーバ情報を返します。フォーマットは特に規定はありません。

Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)

TE (要求)

ブラウザが処理可能な拡張転送コーディング方式(chunked など)や、チャンク転送の際の trailer フィールドを解釈可能かどうかをサーバに伝えます。

TE: trailers

Trailer (要求/応答)

ヘッダ情報をコンテンツの先頭ではなく、チャンク形式で分割送信されたコンテンツの後ろに付加する場合、そこに付加されたヘッダの一覧を示します。これは、CGI がデータ送信した後に Content-Length ヘッダを付加したい場合などに役立ちます。

Trailer: Content-Length

Transfer-Encoding (要求/応答)

転送に使用されるエンコード形式を示します。

Transfer-Encoding: chunked

Upgrade (要求/応答)

別のプロトコルを用いることを推奨する旨を相手に伝えます。クライアント・プロキシ間のような直接接続にのみ有効です。

Upgrade: HTTP/2.0, SHTTP/1.3

User-Agent (要求)

ブラウザ(=ユーザエージェント)の情報をサーバに伝えます。フォーマットは特に規定はありません。ブラウザの種別やバージョン、プラットフォームなどの情報が含まれます。下記は、Mozilla/4.0(=Netscape Navigator 4.0)と互換性のある Microsoft の IE 6.0 で、OS は Windows NT 5.1(=Windows XP)であることを示しています。(→ Server

User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)

Vary (応答)

AcceptAccept-CharsetAccept-Language など、サーバ主導型ネゴシエーションで使用されたヘッダ情報を示します。これは、キャッシュの有効性を判断する際に役立ちます。例えば、下記の例には Accept-Language が含まれています。これは、ブラウザが Accept-Language: ja を送信したためにサーバーが日本語のコンテンツを返却している可能性があり、Accept-Language: en で要求すると別の別のコンテンツが返却される可能性があることを示します。

Vary: Accept-Charset, Accept-Language

Via (要求/応答)

メッセージの転送経路を示します。下記の例では、メッセージが aaa → bbb → ccc というプロキシを経路して転送されたことを示します。1.1 はプロトコルバージョンです。

Via: 1.1 aaa, 1.1 bbb, 1.1 ccc

Warning (要求/応答)

ステータス行に付加されるワーニングコードとメッセージを伝えます。

Warning: 110 xxxsv "Response is stale"

WWW-Authenticate (応答)

認証が必要であることを示します。下記の例では、このリソースが BASIC認証という、HTTP で最も基本的な方式で保護されていることを示します。XXXXXX の部分にはこの認証に関する説明文が入ります。(→ Authorization

WWW-Authenticate: Basic realm="XXXXXX"

extension-header (要求/応答)

上記の他にも、サーバの実装により様々なヘッダが実装されています。

仮想ホスト

HTTP/1.1 では仮想ホストがサポートされました。HTTP/1.1 のクライアントは Host ヘッダでホスト名を送信しなくてはなりません。サーバーは、仮想ホストに対応したコンテンツを応答します。これにより、1台のサーバーで複数のWebサイトをサポートすることが可能になりました。

要求
GET / HTTP/1.1
Host: www.tohoho-web.com

持続的接続

HTTP/1.1 では持続的接続が標準となりました。クライアントは下記のように 1回の TCP接続で複数のコンテンツを要求することにより、通信パフォーマンスを向上させることができます。持続接続を継続する場合には通常 Connection ヘッダで Keep-Alive を、最後の要求には close を指定します。

要求
GET /aaa.html HTTP/1.1
Host: www.tohoho-web.com
Connection: Keep-Alive

GET /bbb.html HTTP/1.1
Host: www.tohoho-web.com
Connection: close

これに対し、サーバーは Content-Length やチャンク(後述)などで複数のコンテンツの境界が明示されたコンテンツを返却します。timeout には次の要求が来ない場合にタイムアウトを発生させる時間(秒数)、max にはこの持続接続で要求可能な要求の残り回数が指定されます。

応答
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive

(aaa.html のコンテンツ)
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Keep-Alive: timeout=5, max=99
Connection: close

(bbb.html のコンテンツ)

チャンク

CGI の結果返却でコンテンツ生成時にはまだコンテンツの長さが分からない場合など、サーバーはチャンク形式のデータを返却することができます。チャンク形式のデータでは、継続するデータのバイト数が 16進数で示されます。0 はデータの終わりを意味します。

応答
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked

1234
(16進数で1234バイトのデータ)
9ab
(16進数で9abバイトのデータ)
0
(コンテンツの終了)

BASIC認証

HTTP のベーシック認証を用いた場合、サーバーは、クライアントからの要求に対して WWW-Authenticate ヘッダを返します。

応答
HTTP/1.1 200 OK
WWW-Authenticate: Basic realm="HIMITSU No PAGE"

クライアントは、WWW-Authenticate ヘッダを受け取るとログイン名とパスワードの入力を促すダイアログを表示し、ユーザーが入力したログイン名とパスワードをエンコードして再度コンテンツの取得を試みます。

要求
HTTP/1.1 200 OK
Host: www.tohoho-web.com
Authorization: Basic abcdEFGhiJklM==

参考文献