HTTP(HyperText Transfer Protocol)は、Web のサーバと、クライアント(ブラウザ)の間で、ウェブページを送受信するためのプロトコルです。基本的にはテキストメッセージを交換することにより、実現されています。
ブラウザで Webページを開く際、ブラウザはサーバに下記のような要求メッセージを送信します。
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/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>
要求メッセージは、次の構文から構成されます。
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/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 | ◎ | ◎ | 最も一般的に使用されるメソッドです。ブラウザはサーバに対してページの取得を要求します。 |
HEAD | ◎ | ◎ | ヘッダのみの情報を要求します。サーバは GET メソッドと HEAD メソッドは必ずサポートしなければなりません。 |
POST | ○ | ○ | CGI でよく使用されるメソッドです。method="POST" を指定したフォームに入力したデータをサーバに転送する際に使用されます。 |
PUT | ○ | ○ | ファイルをサーバにアップロードする際に用いられます。 |
DELETE | ○ | ○ | 指定したリソースを削除することをサーバに要求します。 |
CONNECT | × | ○ | プロキシサーバを経由して SSL 通信する際などに使用します。 |
OPTIONS | × | ○ | サーバがサポートしているメソッドやオプションを調べる際に用います。 |
TRACE | × | ○ | HTTP要求がどのプロキシサーバを経由して送信されるかなど、HTTP の動作をトレースする際に用います。このメッセージを受け取った最後のサーバは、要求メッセージに含まれるエンティティ(通常はヘッダ+メッセージボディ)をそのまま返します。 |
LINK | ○ | × | 指定した URL とリソースにリンク関係を結びます。HTTP/1.1 では廃止されました。 |
UNLINK | ○ | × | 指定した URL とリソースの間のリンク関係を解除します。HTTP/1.1 では廃止されました。 |
Apache では上記の他にも PATCH、PROPFIND、PROPPATCH、MKCOL、COPY、MOVE、LOCK、UNLOCK などのメソッドをサポートしているようです。
応答メッセージにはステータス番号が含まれます。
分類 | 番号 | メッセージ | 説明 |
---|---|---|---|
情報 | 100 | Continue | 処理を継続しています。続きのリクエストを送信してください。 |
101 | Switching Protocols | Upgrade ヘッダで指定したプロトコルに変更して再要求してください。 | |
成功 | 200 | OK | 成功しました。 |
201 | Created | Location ヘッダで指定した場所に新しいコンテンツが作成されました。 | |
202 | Accepted | 要求は受理されました。ただし処理は完了していません。 | |
203 | Non-Authoritative Information | 応答ヘッダはオリジナルサーバーが返したものとは異なりますが、処理は成功です。 | |
204 | No Content | コンテンツはありませんが、処理は成功しました。 | |
205 | Reset Content | 要求を受理したので、現在のコンテンツ(画面)を破棄してください。。 | |
206 | Partial Content | コンテンツを一部のみ返却します。 | |
転送 | 300 | Multiple Choices | コンテンツ入手方法について複数の選択肢があります。 |
301 | Moved Permanently | Location ヘッダで指定された別の場所に移動しました。 | |
302 | Found | Location ヘッダで指定された別の場所に見つかりました。そちらを見てください。 | |
303 | See Other | Location ヘッダで指定された他の場所を見てください。 | |
304 | Not Modified | 更新されていません。If-Modified-Since ヘッダを用いた場合に返却されます。 | |
305 | Use Proxy | Location ヘッダで指定したプロキシを使用してください。 | |
306 | (Unused) | 未使用。 | |
307 | Temporary Redirect | 別の場所に一時的に移動しています。 | |
クライアントエラー | 400 | Bad Request | 要求が不正です。 |
401 | Unauthorized | 認証されていません。 | |
402 | Payment Required | 支払いが必要です。 | |
403 | Forbidden | アクセスが認められていません。 | |
404 | Not Found | 見つかりません。 | |
405 | Method Not Allowed | 指定したメソッドはサポートされていません。 | |
406 | Not Acceptable | 許可されていません。 | |
407 | Proxy Authentication Required | プロキシ認証が必要です。 | |
408 | Request Timeout | リクエストがタイムアウトしました。 | |
409 | Conflict | リクエストがコンフリクト(衝突・矛盾)しました。 | |
410 | Gone | 要求されたコンテンツは無くなってしまいました。 | |
411 | Length Required | Content-Length ヘッダを付加して要求してください。 | |
412 | Precondition Failed | If-... ヘッダで指定された条件に合致しませんでした。 | |
413 | Request Entity Too Large | 要求されたエンティティが大きすぎます。 | |
414 | Request-URI Too Long | 要求された URI が長すぎます。 | |
415 | Unsupported Media Type | サポートされていないメディアタイプです。 | |
416 | Requested Range Not Satisfiable | 要求されたレンジが不正です。 | |
417 | Expectation Failed | Expect ヘッダで指定された拡張要求は失敗しました。 | |
サーバーエラー | 500 | Internal Server Error | サーバーで予期しないエラーが発生しました。 |
501 | Not Implemented | 実装されていません。 | |
502 | Bad Gateway | ゲートウェイが不正です。 | |
503 | Service Unavailable | サービスは利用可能ではありません。 | |
504 | Gateway Timeout | ゲートウェイがタイムアウトしました。 | |
505 | HTTP 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 |
ブラウザが受信可能なデータ形式(MIMEタイプ)をサーバに伝えます。アスタリスク(*)は「すべて」を意味します。下記は、ブラウザが GIF や JPEG、その他どんな形式のデータでも受信可能であることを示します。(→ Content-Type)
Accept: image/gif, image/jpeg, */*
ブラウザが受信可能な文字セットをサーバに伝えます。下記は、ブラウザが iso-8859-5 と Shift_JIS のみを受信可能であることを示します。(→ Content-Type)
Accept-Charset: iso-8859-5, Shift_JIS
ブラウザが受信可能なエンコード方式をサーバに伝えます。例えば、ブラウザが gzip 形式をサポートしていることをサーバに伝え、サーバはメッセージボディを自動的に gzip 圧縮してブラウザに送り、ブラウザ側がこれを自動的に解凍して画面に表示します。こうした機構により、通信負荷を低減することが可能です。(→ Content-Encoding)
Accept-Encoding: gzip, deflate
ブラウザが受信可能な言語をサーバに伝えます。下記は、ブラウザが日本語のみを受信可能であることを意味します。(→ Content-Language)
Accept-Language: ja
Range 要求において使用可能な単位をクライアントに伝えます。現在定義されているのは bytes のみです。(→ Range、Content-Range)
Accept-Ranges: bytes
エンティティが生成されてからの予測経過時間(秒)を示します。下記の例では、このエンティティがおそらく、プロキシサーバで 30秒間程度保持されたもの、つまり、30秒程度古いデータであることを示します。
Age: 30
要求URL で示すリソースに対して使用可能なメソッドの一覧を示します。下記の例では、このリソースに対して GET、HEAD、PUT メソッドを使用可能であることを示します。
Allow: GET, HEAD, PUT
認証が必要なリソースに対して認証情報を伝えます。例えば、BASIC認証の場合は、Basic の文字と、ユーザ名とパスワードをコロン(:)で連結したものを BASE64 形式にエンコードしたものを転送します。(→ WWW-Authenticate)
Authorization: Basic dGFuYWthOmhpbWl0c3U=
キャッシュに関する指示を表します。下記の例では、プロキシサーバやクライアントがこのリソースをキャッシュしてはならないことを示しています。HTTP/1.0 では Pragma: no-cache が使用されます。(→ Pragma)
Cache-Control: no-cache
HTTP/1.1 でサポートされた持続接続機能をブラウザがサポートしている場合、その旨を相手に伝えます。持続接続を用いることにより、1回の接続で複数のリクエスト/レスポンスを発行することが可能になります。
Connection: Keep-Alive
持続接続を完了する場合、サーバは close を返却します。
Connection: close
その他にも、サーバ・プロキシ間、プロキシ・クライアント間のような直接接続にのみ有効なヘッダの一覧を示すために用いられます。プロキシサーバはこのヘッダで指定されたヘッダ情報を削除して、転送しなくてはなりません。
Connection: Upgrade
コンテンツのエンコード方式を示します。下記は、コンテンツが gzip 形式で圧縮されていることを示します。(→ Accept-Encoding)
Content-Encoding: gzip
コンテンツの言語を en(英語)、ja(日本語)などで示します。
Content-Language: ja
コンテンツ(=メッセージボディ)の長さをバイト単位で示します。ヘッダとメッセージボディの間の改行のバイト数は除きます。
Content-Length: 4891
コンテンツが別の URL でもアクセス可能なとき、そのエンティティの URL を絶対URL または相対URL で示します。(→ Location)
Location: http://xxx.yyy.zzz/index.htm
コンテンツが通信途中で改変されていないかをチェックするために、コンテンツに関するチェックデータ(128ビットのMD5ダイジェストをBASE64エンコードしたもの)を示します。
Content-MD5: GitH4qFa4GasgWxJs8ha5Q==
相手に送信するコンテンツの範囲を示します。下記の例では、コンテンツ全体は 12345バイトあり、その中の 0バイト目から 999バイト目の部分を送信していることを示します。(→ Range、Accept-Ranges)
Content-Range: bytes 0-999/12345
コンテンツの種別を MIMEタイプで示します。下記は、コンテンツの内容がテキスト(HTML)形式であることを示します。
Content-Type: text/html
加えて、文字コード(Shift_JIS、euc-jp、ISO-2022-JP、UTF-8 など)を示すこともできます。
Content-Type: text/html; charset=Shift_JIS
応答を返す時刻を示します。曜日(Sun,)は省略可能です。日付は 1 でも 01 でも構いません。年は 2桁でも 4桁でも構いませんが 4桁が推奨されています。秒(:23)は省略可能です。時間帯は GMT(グリニッジ標準時)を用いることが多いようです。
Date: Sun, 04 Jan 2004 16:06:23 GMT
エンティティとそのバージョンを一意に識別する識別子を示します。識別子は、ファイル識別子やサイズ、更新時刻などの情報から計算されます。(→ If-Match、If-None-Match、If-Range)
ETag: "1dba6-131b-3fd31e4a"
いろいろな目的で使用されます。
Expect: 100-continue
エンティティの有効期限を示します。有効期限を過ぎたエンティティはキャッシュから削除されます。
Expires: Thu, 01 Dec 1994 16:00:00 GMT
この要求を行った人のメールアドレスを指定します。検索エンジンがロボットで探索する場合に、探索に関する問い合わせ先のメールアドレスを通知する際などに利用されます。
From: aaa@xxx.yyy.zzz
HTTP/1.1 で唯一の必須ヘッダです。ブラウザからサーバに対して、サーバ名を送信します。サーバが名前ベースの仮想ホストをサポートしている場合、この名前を手がかりにどのサーバとして振舞うか決定されます。例えば、http://aaa.sample.dom/ と http://bbb.sample.dom/ は実は同じサーバ(IPアドレス:61.206.47.206)ですが、Host ヘッダでホスト名を指定することにより、仮想的に 2つのサーバとして振舞うことが可能になります。
Host: aaa.sample.dom
指定した ETag にマッチする場合にのみ、メソッドを実行することをサーバに依頼します。(→ ETag、If-None-Match)
If-Match: "1dba6-131b-3fd31e4a"
クライアント側がすでにキャッシュを持っている場合、キャッシュの日付をサーバに通知し、「この日付よりも新しいものがあれば転送してくれ」と要求します。もし、更新されていなければサーバは 304(not modified)ステータスを返し、ブラウザはキャッシュしていたデータを表示します。(→ If-Unmodified-Since)
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
指定した ETag にマッチしない場合にのみ、メソッドを実行することをサーバに依頼します。(→ ETag、If-Match)
If-None-Match: "1dba6-131b-3fd31e4a"
クライアントが、エンティティの一部をすでに保持している場合に、「もし、この ETag で指定したエンティティの一部が最新のものであるならば、残りのすべてを、さもなくば全体を送信してくれ」の意味で要求します。Range ヘッダと組み合わせて使用します。(→ ETag、Range)
Range: bytes=0-1023 If-Range: "1dba6-131b-3fd31e4a"
エンティティが、指定した日付よりもあとに更新されていなければ、要求を処理します。更新されている場合、サーバは 412(Precondition Failed)ステータスを返します。(→ If-Modified-Since)
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
エンティティが最後に更新された時刻を示します。(→ If-Modified-Since)
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT
エンティティの場所が移動した場合など、ブラウザが要求した URL とは別の URL にジャンプさせたい場合に使用します。URL には http:// や https:// で始まる絶対URL を指定します。(→ Content-Location)
Location: http://www.yyy.zzz/aaa.html
OPTIONS や TRACE メソッドにおいて、プロキシサーバの最大ホップ数を指定します。プロキシサーバはこの値をひとつ減算して、次のプロキシサーバに転送します。この値が 0 になると、プロキシサーバは最後の受信者として応答を返します。
Max-Forwards: 16
様々な目的で使用されます。例えば、下記はキャッシュを禁止する旨をプロキシサーバやクライアントに通知します。(→ Cache-Control)
Pragma: no-cache
プロキシサーバとクライアントの間で認証が必要であることを示します。(→ Proxy-Authorization、WWW-Authenticate)
Proxy-Authenticate: Basic realm="XXXXXX"
プロキシサーバとクライアント間の認証情報を渡します。(→ Proxy-Authenticate、Authorization)
Proxy-Authorization: Basic dGFuYWthOmhpbWl0c3U=
クライアントからサーバに対して、エンティティの一部のみを要求します。下記の例では、ページの最初の 1000バイト(0バイト目から 999バイト目)のみを要求しています。(→ Accept-Ranges、Content-Range、If-Range)
Range: bytes=0-999
この要求の元となったページの URL(通常はリンク元のURL)を通知します。
Referer: http://xxx.yyy.zzz/index.html
数秒後に再度要求してくれという意味で、503(Service Unavailable)や 3xx(Redirection)ステータスとともに返されます。下記は、後120秒後に再要求してくれの意味を持ちます。Date: 形式の絶対時刻が返されることもあります。
Retry-After: 120
サーバからブラウザに対してサーバ情報を返します。フォーマットは特に規定はありません。
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
ブラウザが処理可能な拡張転送コーディング方式(chunked など)や、チャンク転送の際の trailer フィールドを解釈可能かどうかをサーバに伝えます。
TE: trailers
ヘッダ情報をコンテンツの先頭ではなく、チャンク形式で分割送信されたコンテンツの後ろに付加する場合、そこに付加されたヘッダの一覧を示します。これは、CGI がデータ送信した後に Content-Length ヘッダを付加したい場合などに役立ちます。
Trailer: Content-Length
転送に使用されるエンコード形式を示します。
Transfer-Encoding: chunked
別のプロトコルを用いることを推奨する旨を相手に伝えます。クライアント・プロキシ間のような直接接続にのみ有効です。
Upgrade: HTTP/2.0, SHTTP/1.3
ブラウザ(=ユーザエージェント)の情報をサーバに伝えます。フォーマットは特に規定はありません。ブラウザの種別やバージョン、プラットフォームなどの情報が含まれます。下記は、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;)
Accept、Accept-Charset、Accept-Language など、サーバ主導型ネゴシエーションで使用されたヘッダ情報を示します。これは、キャッシュの有効性を判断する際に役立ちます。例えば、下記の例には Accept-Language が含まれています。これは、ブラウザが Accept-Language: ja を送信したためにサーバーが日本語のコンテンツを返却している可能性があり、Accept-Language: en で要求すると別の別のコンテンツが返却される可能性があることを示します。
Vary: Accept-Charset, Accept-Language
メッセージの転送経路を示します。下記の例では、メッセージが aaa → bbb → ccc というプロキシを経路して転送されたことを示します。1.1 はプロトコルバージョンです。
Via: 1.1 aaa, 1.1 bbb, 1.1 ccc
ステータス行に付加されるワーニングコードとメッセージを伝えます。
Warning: 110 xxxsv "Response is stale"
認証が必要であることを示します。下記の例では、このリソースが BASIC認証という、HTTP で最も基本的な方式で保護されていることを示します。XXXXXX の部分にはこの認証に関する説明文が入ります。(→ Authorization)
WWW-Authenticate: Basic realm="XXXXXX"
上記の他にも、サーバの実装により様々なヘッダが実装されています。
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 (コンテンツの終了)
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==