HTTP Headers 部分字段笔记

一个简单的 request 可以像下面这样:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 
Host: net.tutsplus.com 

而复杂起来可以像下面这样:
Accept    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset    UTF-8,*
Accept-Encoding    gzip, deflate
Accept-Language    zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Cache-Control    max-age=0
Connection    keep-alive
Cookie    fc=fcVal=634513393390715776; __utma=118891282.16916071.13137550.1327303242.1327308483.209; __utmz=118891282.1326609907.194.66.utmcsr=t.co|utmccn=(referral)|utmcmd=referral|utmcct=/CzETxUKX; wp-settings-1=m5%3Do%26m9%3Do%26m8%3Do%26m6%3Do%26m1%3Do%26m7%3Dc%26m4%3Do; wp-settings-time-1=1327827407; Hm_lvt_c83c032e78cf7375a9080f7c7cb11f4d=1329629501454; wordpress_logged_in_291e3cce02324c1995dd5347a4c388d8=jaseywang%7C1330445508%7C1c14af67aebf19f5; Hm_lpvt_c83c032e78cf7375a9080f7c7cb11f4d=1329629501454
Host    jaseywang.me
User-Agent    Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0


1.GET/POST/HEAD
三种方法,使用的场景不同。

GET 的是获取 html,图片,JavaScript,CSS 最主要的方法,大多数的请求使用的都是 GET。同样的,网页表也可以通过 GET 实现:
<form method="GET" action="foo.php">
First Name: <input name="first_name" type="text"> <br />
Last Name: <input name="last_name" type="text"> <br />
<input type="submit" name="action" value="Submit" />
</form>

当该表单提交时,该 HTTP 看起来会是这样:
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1 

尽管 GET 可以提交表单,查询字符,但是在大多数的情况下,更佳的办法是用是 POST 方法,在传输大数据时,使用 GET 并不实用,并且尤其局限性。下面这个是改用 POST 来提交上面的表单:
<form method="POST" action="foo.php">
First Name: <input type="text" name="first_name" /> <br />
Last Name: <input type="text" name="last_name" /> <br />
<input type="submit" name="action" value="Submit" />
</form>

提交完毕后,会产生下面这样的 request:
POST /foo.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43

first_name=John&last_name=Doe&action=Submit

HEAD 跟 GET 类似,只不过 server 端不返回请求的内容,只有 header。此方法可以检测需要请求的文件是否被修改,对于 cache 尤其适用;或者检测该文件是否存在。让然如果你想检查你的博客上的 broken links,使用 HEAD 会比 GET 高效的多。

2.几个段的返回码

200 请求成功
300 需要有重定向的
400 客户端的请求有问题
500 服务器端有问题

其中 301 跟 302 的区别,前者是永久的,后者是暂时的,这个对于搜索引擎尤其重要。如果你的网站只是暂时性的维护,需要将其重定向到另外一个网站,使用 302 会是一个比较好的选择,这会通知搜索引擎过一段时间后来继续抓取;而如果使用 301,则告诉搜索引擎,该站点再也不存在了,比如我的 www.jaseywang.me 就是 301 到 jaseywang.me 的。
至于 401,403,404 这都很好理解,一般出现 500 错误就不是客户端的问题了。

3.If-Modified-Since
这个是客户端的请求字段,主要是用来 cache。如果该网页已经在你的浏览器中做了 cache,当你再次访问时,浏览器会发送下面这个来检测该网页是否修改了:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT 
如果没有修改,server 会返回 304,并且不会返回任何的内容,然后浏览器则从本地的 cache 中获取内容。

4.Authorization
这个是客户端用来做认证的,当请求的页面需要认证时,浏览器会弹出一个窗口,让你输入用户名和密码,然后会发送另外一个请求,该请求的 header 则包含下面这个:
Authorization: Basic bXl1c2VyOm15cGFzcw== 
Basic 后面的是经过 base64 编码的,Linux 下通过 base64 查看:
$ echo bXl1c2VyOm15cGFzcwo= | base64 -d

5.Cache-Control
这个可以出现的 c/s 中:
Cache-Control: max-age=3600, public 
上面的这个出现在响应环节,除了 public,max-age,还有 private,no-cache,must-revalidate 等;而请求时的指令包括 no-cache,max-age 等。
有关 HTTP cache 的会单独写一篇笔记。

6.Etag
另外一个用来做 cache 的指令:
Etag: "pub1259380237;gz" 
后面的一串字符可以是文件大小,哈希值或者各种组合等等,没有固定的用法。当 server 发送 Etag 给浏览器时,浏览器会保留该值,下次请求同样的文件时,它会发出下面这样的请求:
If-None-Match: "pub1259380237;gz" 
如果匹配,则返回 304,然后浏览器使用本地的 cache 来加载。

7.Last-Modified
该文件的最后一次修改时间,GMT 格式:
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT 
同样,也是用来 cache 的一种方式,浏览器可以像下面这样发送:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT 

8.WWW-Authenticate
该指令用来认证用户,当浏览器收到该指令后,会打开输入认证信息的对话框:
WWW-Authenticate: Basic realm="Restricted Area" 

ref:
http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/
http://en.wikipedia.org/wiki/List_of_HTTP_status_codes