HTTP Header 内容详解

  HTTP       2014-07-19


一、什么是HTTP Headers?

HTTP是Hypertext Transfer Protocol的缩写,整个WWW都在使用此协议,几乎你在浏览器里看到的大部分內容都是通过HTTP协议来进行传输,比如你当前看的这篇文章。

HTTP Headers是HTTP请求和响应的核心,它承载了用户端浏览器、请求页面和服务器等相关资讯。

HTTP WORK FLOW
例如,当你在浏览器地址栏里输入一个URL,你的浏览器会发出类似下面的HTTP请求:

  1. GET /blog/ HTTP/1.1 (Request line)
  2. Host: net.tutsplus.com
  3. 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)
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: en-us,en;q=0.5
  6. Accept-Encoding: gzip,deflate
  7. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  8. Keep-Alive: 300
  9. Connection: keep-alive
  10. Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
  11. Pragma: no-cache
  12. Cache-Control: no-cache

第一行被称为Request Line, 它描述的是这个请求的基本信息,剩下的就是HTTP Headers了。

请求完成后,你的浏览器可能会收到如下的HTTP响应:

  1. HTTP/1.x 200 OK (state line)
  2. Transfer-Encoding: chunked
  3. Date: Sat, 28 Nov 2013 04:36:25 GMT
  4. Server: LiteSpeed
  5. Connection: close
  6. X-Powered-By: W3 Total Cache/0.8
  7. Pragma: public
  8. Expires: Sat, 28 Nov 2013 05:36:25 GMT
  9. Etag: "pub1259380237;gz"
  10. Cache-Control: max-age=3600, public
  11. Content-Type: text/html; charset=UTF-8
  12. Last-Modified: Sat, 28 Nov 2013 03:50:37 GMT
  13. X-Pingback: http://net.tutsplus.com/xmlrpc.php
  14. Content-Encoding: gzip
  15. Vary: Accept-Encoding, Cookie, User-Agent
  16. <!-- ... rest of the html ... -->

第一行被称为Status Line,它之后就是HTTP Headers,接着便开始输出內容了(在这个案例中是一些HTML输出)。

但你查看页面源代码却不能看到HTTP Headers,虽然它们连同你能看到的内容一起被传送至浏览器。

这个HTTP请求也发出了一些其他资源的接收请求,例如图片,css文件,js文件等等。

下面我们来看看细节。

二、怎样看到HTTP Headers信息?

1、Chrome浏览器:

可按F12或者Shift + Ctrl + i 调出Chrome开发者工具,依照下图所示便可查看到HTTP Headers信息,包含Request Headers和Response Headers信息。(注:若Network中内容为空,刷新页面即可;下图为解析后的内容,可通过 view source 查看具体信息)

Chrome HTTP Headers Watch

2、Firefox

可通过firebug查看,具体使用方法可Google之;

3、Live HTTP Headers

这是Firefox的扩展程序,可查看所浏览页面的HTTP Headers信息;

4、代码方式

在PHP中,可采用下列方式:

三、HTTP Request 的构成

  1. GET /blog/ HTTP/1.1

此句被称为“Request line”,包含三个部分:

  • “method” 表明这是何种类型的请求. 最常见的请求类型有 GET, POST 和 HEAD;
  • “path” 体现的是Host之后的路径, 例如,当你请求 “http://woerwosi.com/blog/”时 , path就是 “/blog/”;
  • “protocol” 包含有协议(HTTP)和版本号(1.1), 目前浏览器基本使用1.1;

剩下的部分每行都是一个“Name:Value”对,包含了各式各样关于请求和浏览器的信息。

例如:

  1. Host: woerwosi.com

代表的是所访问的HTTP服务器的域名/IP地址和端口号(默认80);

  1. Connection: keep-alive

代表的是客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

  1. User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36

代表的是浏览器的版本和所用的操作系统;

  1. Accept-Encoding: gzip,deflate,sdch

会告诉服务器,浏览器可以接受类似gzip的压缩输出。

这些headers大部分内容都是可选的。HTTP请求甚至可以被精简为下面这样子,并能从服务器得到有效的响应:

  1. GET /blog/ HTTP/1.1
  2. Host: woerwosi.com


四、请求类型

三种较为常见的类型分别为:GET、POST、HEAD,其中前两者可能大家较为熟悉;

(1)GET:获取一个文档

大部分被传输到浏览器的文件,例如CSS、JS、HTML等都是通过GET方式获得的,它是获取文档的主要方式。其中较为重要的是表单数据提交时若使用GET方式,可以将“表单输入”通过附加到查询字符串的方式发送到服务器,如下所示:

  1. GET /register.php?first_name=Jimg&last_name=Green&action=Submit HTTP/1.1

(2)POST:发送数据至服务器

尽管可以通过GET方式发送数据至服务器,但在很多情况下,使用POST更加合适,使用GET有一定的局限性。

上例若使用POST方式发送,大体代码如下:

  1. POST /register.php HTTP/1.1
  2. Host: localhost
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20131102 Firefox/3.5.5 (.NET CLR 3.5.30729)
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: en-us,en;q=0.5
  6. Accept-Encoding: gzip,deflate
  7. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  8. Keep-Alive: 300
  9. Connection: keep-alive
  10. Referer: http://localhost/register.php
  11. Content-Type: application/x-www-form-urlencoded
  12. Content-Length: 43
  13. first_name=Jim&last_name=Green&action=Submit

这里需要注意一下几点:

  • 第一行的路径已经变为简单的/register.php,已经无查询字符串;
  • 新增了Content-Type和Content-Lenght Header,它提供了发送信息的相关内容;
  • 所有内容都在headers之后,以查询字符串的形式被发送;

(3)HEAD:接受Header信息

HEAD和GET很相似,只是HEAD不接收HTTP响应的内容部分。当发送了一个HEAD请求,意味着我们只对HTTP Headers感兴趣,而不是文档本身。

这个方法可以让浏览器判断页面是否被修改过,从而控制缓存;也可用来判断文档是否存在。例如,你的网站上有很多链结,可以简单的给他们发送HEAD请求来判断是否存在斯死链,此方式比GET快很多。

五、HTTP Response 的构成

当浏览器发送了HTTP请求之后,服务器会通过HTTP response来响应这个请求,若不关心具体内容,那么这个响应是这样的:

  1. HTTP/1.1 200 OK
  2. Server: nginx/1.6.0
  3. Date: Thu, 24 Jul 2014 15:49:25 GMT
  4. Content-Type: text/html;charset=utf-8
  5. Transfer-Encoding: chunked
  6. Connection: keep-alive
  7. X-Powered-By: PHP/5.5.13
  8. Content-Encoding: gzip

第一个有价值的信息就是协议,目前大多数服务器器使用HTTP/1.1 或者HTTP/1.x;

接下来便是服务器响应的状态码,200 OK代表的是服务器已经接受到我们的请求,并且成功返回我们请求的内容;404是我们经常见到的一种状态码,它代表的是我们所请求的路径或者文件不存在;

剩余的响应内容与HTTP请求Header信息类似,这些内容是关于服务器信息、文档页面何时修改、mime type等信息;同样,这些内容是可选的。

六、HTTP状态码

  • 200,表示请求成功;
  • 300,表示重定向;
  • 400,表示请求页面出现问题;
  • 500,表示服务器出现问题;


下面详细看一下各个区段可能出现的状态码:

200,OK;
206,只请求到部分内容(通常见于下载);

301,永久性转移;
302,临时性转移;
关于更多301和302的信息,请查看:301与302的区别

401,未经授权(Unauthorized),受密码保护的页面会返回这个状态;
403,被禁止(Forbidden);
404,未找到(Not Found);

500,服务器错误;

关于更多状态码请查看:HTTP状态码完整列表
......

七、HTTP Headers 中的HTTP請求

Host

一个HTTP请求会发送一个特定的IP地址,而大部分服务器都有在同一个IP地址下托管多个网站的能力,那么服务器必须知道浏览器请求的是哪个页面下的资源;

Host: woerwosi.com,这只是基本的主机名,包含域名和子级域名;

User-Agent

  1. User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36

这个Header通常包含以下信息:

  • 浏览器名和版本号;
  • 操作系统名和版本号;
  • 默认语言;

某些网站可以利用此信息收集访客的信息。例如可以判断访客是否在使用手机访问你的网站,然后决定是否将他们引导至一个在低分辨率下表现良好的移动网站。

Keep-Alive

除此之外:Keep-Alive: timeout=5, max=100:timeout:过期时间5秒(对应httpd.conf里的参数是:KeepAliveTimeout),max是最多一百次请求,强制断掉连接,就是在timeout时间内又有新的连接过来,同时max会自动减1,直到为0,强制断掉。

下图为重复连接和可持续连接的比较示意图:
HTTP Keep-Alive

其它关于Keep-Alive的说明可参考:

  1. HTTP Keep-Alive详解
  2. Keep-Alive优化方案

To Be Continued...

本文最后更新于2014-07-19 18:24:30