前些天因为一些编程须要,接触到了HTTPheader的有关知识,因而就本着学习的目的索性把这个东西弄个明白。今天在这里总结一下,但愿能帮助到一些有这方面知识要求的同窗,也方便本身在之后的学习中做参考。因为我也是第一次接触到这个东西,若是有什么错误的理解和表述但愿你们能够热心的及时提出来,以避免误导了更多看到这篇文章的人,也方便我本身及时更正本身的错误。web
下面入正题。编程
WHAT IS HTTP浏览器
HTTP是“Hypertext Transfer Protocol”的缩写,是一个应用层协议,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部份内容都是经过http协议来传输的。缓存
WHAT IS HTTPHEADER安全
HTTP Headers(HTTP头部)是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。服务器
HTTP Headers 中的 HTTP请求cookie
当咱们打开浏览器,点击一个超级连接的时候(好比https://www.google.com.hk/ )此时浏览器会作出相似以下的HTTP请求app
这个图是我在打开这个网页的时候用HTTP Analyzer抓取的dom
下面咱们一行一行的来解释各句话的的意思
第一行,被称做“Request - Line”请求行它包括三个部分:
I)第一个字段为“method” 它代表这是何种类型的请求. 最多见的请求类型有 GET, POST 和 HEAD.学过WEB的应该比较熟悉这三种方法的区别与联系,此处使用的是GET 方法,这也是浏览器中比较经常使用的方法
II)第二个字段为“path” 它体现的是主机以后的路径. 例如,当你作出请求
GET /webhp?hl=zh-CN&sourceid=cnh path HTTP/1.1时path就是
“/webhp?hl=zh-CN&sourceid=cnhes/”.它表示获取/webhp?hl=zh-CN目录下资源ID为 cnhes的页面,再如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif 动态图片文件。
III)第三个字段为“protocol” 包含有 “HTTP” 和版本号, 现代浏览器都会使用1.1.
剩下的部分每行都是一个“Name:Value”对。它们包含了各式各样关于请求和你浏览器的信息
第二行,字段以下 它指明了主机的名称很显然这是Google的web服务器;
第三行,字段以下. 它代表了连接状态
若是为close 则表示告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开链接,不要等待本次链接的后续请求了;
Keepalive 则表示告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持链接,等待本次链接的后续请求。
Keep-Alive:若是浏览器请求保持链接,则该头部代表但愿 WEB 服务器保持链接多长时间(秒)。例如:Keep-Alive:300
第四行,
是在告诉web服务器本身接受什么样的介质text/html表示接受text文档下的子文档html文档,*/*表示接受全部的文档
第五行
它指明了
一、浏览器名,版本号,Moziall/5.0 Chrome/31.0.1650.63 Safari/537.36AppleWebKit/537.36 (KHTML, like Gecko)
二、操做系统名,版本号Windows NT 6.1; WOW64)
三、默认的)语言等
第六行,这应该是Chrome的一些变量参数,我也不太清楚这个东西
第七行,表示能够接受的编码,大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。
这能够减小近80%的文件大小,以节省下载时间和带宽。
第八行,表示支持的语言
这个信息能够说明用户的默认语言设置。若是网站有不一样的语言版本,那么就能够经过这个信息来重定向用户的浏览器。它还能够经过逗号分割来携带多国语言。第一个会是首选的语 言,其它语言会携带一个“q”值,来表示用户对该语言的喜爱程度(0~1)。
第九行,
是有关cookie的说明
另外,还可能有以下字段一并整理以下
Referer字段
Referer字段容许客户端指定请求uri的源资源地址,这能够容许服务器生成回退链表,可用来登录、优化cache等。他也容许废除的或错误的链接因为维护的目的被追踪。
若是请求的uri没有本身的uri地址,Referer不能被发送。若是指定的是部分uri地址,则此地址应该是一个相对地址。
Range字段
Range字段能够请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节之后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
可是服务器能够忽略此请求头,若是无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。
HTTP Headers 中的 HTTP响应
这是HTTP响应的Header部分
第一行,“Status Header”称为状态行HTTP/1.1 302 Found意思是说,请求的资源如今临时从不一样的 URI 响应请求。
因为这样的重定向是临时的,客户端应当继续向原有地址发送之后的请求,下附HTTP状态码表
状态码 |
已定义范围 |
分类 |
1XX |
100-101 |
信息提示 |
2XX |
200-206 |
成功 |
3XX |
300-305 |
重定向 |
4XX |
400-415 |
客户端错误 |
5XX |
500-505 |
服务器错误 |
下面是详细更的解释
I)1XX信息状态码
状态码 |
状态消息 |
含义 |
100 |
Continue(继续) |
收到了请求的起始部分,客户端应该继续请求 |
101 |
Switching Protocols(切换协议) |
服务器正根据客户端的指示(Update Header)切换协议 |
II)2XX成功状态码
状态码 |
状态消息 |
含义 |
200 |
OK |
服务器成功处理了请求(这个是咱们见到最多的) |
201 |
Created(已建立) |
对于那些要服务器建立对象的请求来讲,资源已建立完毕。 |
202 |
Accepted(已接受) |
请求已接受, 但服务器还没有处理 |
203 |
Non-Authoritative Information(非权威信息) |
服务器已将事务成功处理,只是实体Header包含的信息不是来自原始服务器,而是来自资源的副本。 |
204 |
No Content(没有内容) |
Response中包含一些Header和一个状态行, 但不包括实体的主题内容(没有response body) |
205 |
Reset Content(重置内容) |
另外一个主要用于浏览器的代码。意思是浏览器应该重置当前页面上全部的HTML表单。 |
206 |
Partial Content(部份内容) |
部分请求成功 |
III)3XX成功状态码
状态码 |
状态消息 |
含义 |
300 |
Multiple Choices(多项选择) |
客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一块儿返回的,而后用户就能够选择他但愿的选项了 |
301 |
Moved Permanently(永久移除) |
请求的URL已移走。Response中应该包含一个Location URL, 说明资源如今所处的位置 |
302 |
Found(已找到) |
与状态码301相似。但这里的移除是临时的。 客户端会使用Location中给出的URL,从新发送新的HTTP request |
303 |
See Other(参见其余) |
相似302 |
304 |
Not Modified(未修改) |
客户的缓存资源是最新的, 要客户端使用缓存 |
305 |
Use Proxy(使用代理) |
必须经过代理访问资源, 代理的地址在Response 的Location中 |
306 |
未使用 |
这个状态码当前没使用 |
307 |
Temporary Redirect(临时重定向 |
相似302 |
IV)客户端错误状态码
状态码 |
状态消息 |
含义 |
400 |
Bad Request(坏请求) |
告诉客户端,它发送了一个错误的请求。 |
401 |
Unauthorized(未受权) |
须要客户端对本身认证 |
402 |
Payment Required(要求付款) |
这个状态还没被使用, 保留给未来用 |
403 |
Forbidden(禁止) |
请求被服务器拒绝了 |
404 |
Not Found(未找到) |
未找到资源 |
405 |
Method Not Allowed(不容许使用的方法) |
不支持该Request的方法。 |
406 |
Not Acceptable(没法接受) |
|
407 |
Proxy Authentication Required(要求进行代理认证) |
与状态码401相似, 用于须要进行认证的代理服务器 |
408 |
Request Timeout(请求超时) |
若是客户端完成请求时花费的时间太长, 服务器能够回送这个状态码并关闭链接 |
409 |
Conflict(冲突) |
发出的请求在资源上形成了一些冲突 |
410 |
Gone(消失了) |
服务器曾经有这个资源,如今没有了, 与状态码404相似 |
411 |
Length Required(要求长度指示) |
服务器要求在Request中包含Content-Length。 |
412 |
Precondition Failed(先决条件失败) |
|
413 |
Request Entity Too Large(请求实体太大) |
客户端发送的实体主体部分比服务器可以或者但愿处理的要大 |
414 |
Request URI Too Long(请求URI太长) |
客户端发送的请求所携带的URL超过了服务器可以或者但愿处理的长度 |
415 |
Unsupported Media Type(不支持的媒体类型) |
服务器没法理解或不支持客户端所发送的实体的内容类型 |
416 |
Requested Range Not Satisfiable(所请求的范围未获得知足) |
|
417 |
Expectation Failed(没法知足指望) |
|
VI)服务器端错误状态码
状态码 |
状态消息 |
含义 |
500 |
Internal Server Error(内部服务器错误) |
服务器遇到一个错误,使其没法为请求提供服务 |
501 |
Not Implemented(未实现) |
客户端发起的请求超出服务器的能力范围(好比,使用了服务器不支持的请求方法)时,使用此状态码。 |
502 |
Bad Gateway(网关故障) |
代理使用的服务器遇到了上游的无效响应 |
503 |
Service Unavailable(未提供此服务) |
服务器目前没法为请求提供服务,但过一段时间就能够恢复服务 |
504 |
Gateway Timeout(网关超时) |
与状态吗408相似, 可是响应来自网关或代理,此网关或代理在等待另外一台服务器的响应时出现了超时 |
505 |
HTTP Version Not Supported(不支持的HTTP版本) |
服务器收到的请求使用了它不支持的HTTP协议版本。 有些服务器不支持HTTP早期的HTTP协议版本,也不支持过高的协议版本 |
第二行,
这个头部是用来重定向的。若是响应代码为 301 或者 302 ,服务器就必须发送该头部。
第三行,
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另外一个消息处理过程当中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义以下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这容许服务器仅仅描述当用户的部分响应消息,此响应消息对于其余用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无心的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机能够接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机能够接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机能够接收超出超时期间的响应消息。若是指定max-stale消息的值,那么客户机能够接收超出超时期指定值以内的响应消息。
第四行,
这个头部包含了文档的”mime-type”。浏览器将会依据该参数决定如何对文档进行解析。
Content-Type: text/html; charset=UTF-8
‘text’ 是文档类型,‘html’则是文档子类型。 这个头部还包括了更多信息,例如 charset 指明了字符集;
若是是一个图片,将会发送这样的响应:Content-Type: image/gif 浏览器能够经过mime-type来决定使用外部程序仍是自身扩展来打开该文档。
以下的例子将会调用Adobe Reader:
Content-Type: application/pdf
直接载入,Apache一般会自动判断文档的mime-type而且添加合适的信息到头部去。
而且大部分浏览器都有必定程度的容错,在头部未提供或者错误提供该信息的状况下它会去自动检测mime-type。
第五行,很显然,这是指明了响应的时间(GMT为格林威治世界时间)。
第六行,
Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识通常按照重要性排序显然,Google使用的是自家的Google Web Server
下附国内网站的Web服务器表
企业名称 |
Web服务器 |
说明 |
谷歌中国 |
Gws |
谷歌自主开发的Google Web Server |
百度 |
BWS |
由百度自主开发的Baidu Web Server |
人人网 |
Ngnix |
由Igor Sysoev为俄罗斯访问量第二 的Rambler.ru站点开发的
|
腾讯 |
Ngnix |
|
163 |
Ngnix |
|
淘宝 |
Tengine (已开源) |
Ngnix的一个变种
|
Sina |
Apache |
|
搜狐 |
Apache |
Apache旗下的开源http服务器 |
开心网 |
Apache |
|
优酷 |
Apache |
第七行,
Content-Length: WEB 服务器告诉浏览器本身响应的对象的长度。
剩下的部分是有关安全的一些字段,这里不作过多讨论(暂不清楚具体意思)
有的还有Set-Cookie字段
Set-Cookie:BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; path=/; domain=.baidu.com
Set-Cookie:BD_CK_SAM=1;path=/
Set-Cookie:BDSVRTM=175; path=/
Set-Cookie:H_PS_PSSID=5013_5141_5041_1422_4261_4760; path=/; domain=.baidu.com
当一个网站须要设置或者更新你浏览的cookie信息时,它就会使用这样的头部
还有的会有这些字段
其中ExpireWEB服务器代表该实体将在何时过时,对于过时了的对象,只有在跟 WEB服务器验证了其有效性后,才能用来响应客户请求。
Last-Modified 顾名思义,这个头部信息用GMT格式代表了文档的最后修改时间;
Etag 服务器可能会将该信息和每一个被发送文件一块儿响应给浏览器。该值能够包含文档 的最后修改日期,文件大小或者文件校验和。这是一个对象(好比URL)的标志值, 就一个对 象而言,好比一个 html 文件,若是被修改了,其 Etag 也会别修改, 因此, ETag 的做用跟 Last-Modified 的做用差很少,主要供 WEB 服务器 判断一个对象是 否改变了。好比前一次请 求某个 html 文件时,得到了其 ETag,当此次又请求这个文 件时,浏览器就会把先前得到的 ETag 值发送给 WEB 服务器,而后 WEB 服务器会 把这个 ETag 跟该文件的当前 ETag 进行 对比,而后就知道这个文件 有没有改变了。
还有以下字段
If-Match:若是对象的 ETag 没有改变,其实也就意味著对象没有改变, 才执行请求的动做。
If-None-Match:若是对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动做。
对于Accept-Ranges
WEB服务器代表本身是否接受获取其某个实体的一部分(好比文件的一部分)的请求。
bytes:表示接受,none:表示不接受
另外,还有
Vary:Accept-Encoding 诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题
Transfer-Encoding:chunked 当不能预先肯定报文体的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就须要经过Transfer-Encoding域来肯定报文体长度,一般状况 下,Transfer-Encoding域的值应当为chunked,代表采用chunked编码方式来进行报文体的传输。
基本上关于HTTP Headers的内容就到这里了。但愿能够帮助到你们!