HTTP (Hypertext Transfer Protocol) はTCP/IPにおけるアプリケーション層プロトコルのひとつです。大まかにはリクエストとレスポンスの二種類によるやりとり方法を定めています。
代表的なリクエストメソッドはGETとPOSTですが、他にもPUTやDELETEなどがあります。いずれもリクエストラインが一行目にきて、空白区切りで「リクエストメソッド、リクエストURL、HTTPのバージョン」の三つを指定します。二行目からは": "で区切られたヘッダが続きます。リクエストメソッドによっては (POSTなど) 空行で終了したヘッダのあとにボディが続きます。
具体例:
GET /search?q=ruby HTTP/1.1
Host: www.qoosky.io
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: toolbarDisplay=hide
Connection: keep-alive
←(空行)
GETで必須となるヘッダはHostのみです。Hostヘッダにはホスト名 (FQDN) とポート番号 (80の場合は省略可能) が指定されます。なお、一行目のリクエストラインにはブラウザごとに決められた上限の長さがあります。
「リクエストライン、ヘッダ、空行、メッセージボディ」からなります。
例:
POST /path/to/resource.php HTTP/1.1
Referer: http://www.example.com/from.php?id=123
Content-Type: application/x-www-form-urlencoded
Content-Length: 128
Host: www.example.com
name=hoge%27hoge&val=123
Content-TypeはMIMEタイプとよばれるリソースの種類を指定するヘッダで、HTMLのformで指定可能です。省略するとapplication/x-www-form-urlencodedになります。これはGETリクエストのようにパーセントエンコードされたもので、特殊記号やマルチバイト文字は%xxを一つ以上用いて表現されます。ただし空白は特別に%20ではなく'+'となります。また、Content-Lengthはメッセージボディ部のサイズ (バイト数) です。
最後に、RefererヘッダにはPOST元 (formがあったページ) のURLが記載されます。英語的に正しいReferrerではなく、つづりミスのRefererです。Refererヘッダには、他にもGETリクエスト時のリンクもと (aリンク (href) を踏んだページ) のURLが記載されます。このように、サーバ側のメリットとしてどこから来たのか把握できる一方で、クライアント側で容易に改変可能であるため絶対的には信用できない情報です。また、例えば悪意あるユーザが自分のサーバへのリンクをコメント欄に埋めこむと、それを踏んだユーザのURLがRefererでバレたりします。もしURLにセッションIDなどが含まれている場合は大変なことになりますね。
「ステータスライン、ヘッダ、空行、ボディ」からなります。一行目のステータスラインには空白区切りで「HTTPのバージョン、ステータスコード、テキストフレーズ」が記載されます。テキストフレーズはステータスコードの人間用の訳のようなものです。
具体例:
HTTP/1.1 302 Found
Date: Mon, 09 Sep 2013 14:24:09 GMT
Server: Apache/2.2.15 (CentOS)
Location: https://www.qoosky.io/search?q=ruby
Content-Length: 300
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://www.qoosky.io/search?q=ruby">here</a>.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at www.qoosky.io Port 80</address>
</body></html>
上記の例ではhttpでアクセスしてしまったユーザをhttpsにリダイレクトしています。ステータスコードについて簡単にまとめます:
Content-Type (MIMEタイプでリソースの種類を指定) の例: