2019独角兽企业重金招聘Python工程师标准>>>
关于HTTP Headers的讨论
前些天由于一些编程需要,接触到了HTTPheader的有关知识,于是就本着学习的目的索性把这个东西弄个明白。今天在这里总结一下,希望能帮助到一些有这方面知识要求的同学,也方便自己在以后的学习中作参考。由于我也是第一次接触到这个东西,如果有什么错误的理解和表述希望大家可以热心的及时提出来,以免误导了更多看到这篇文章的人,也方便我自己及时更正自己的错误。
下面入正题。
WHAT IS HTTP
HTTP是“Hypertext Transfer Protocol”的缩写,是一个应用层协议,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的。
WHAT IS HTTPHEADER
HTTP Headers(HTTP头部)是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。
HTTP Headers 中的 HTTP请求
当我们打开浏览器,点击一个超级链接的时候(比如https://www.google.com.hk/ )此时浏览器会做出类似如下的HTTP请求
这个图是我在打开这个网页的时候用HTTP Analyzer抓取的
下面我们一行一行的来解释各句话的的意思
第一行,被称作“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文档,*/*表示接受所有的文档
第五行
它指明了
1、浏览器名,版本号,Moziall/5.0 Chrome/31.0.1650.63 Safari/537.36AppleWebKit/537.36 (KHTML, like Gecko)
2、操作系统名,版本号Windows NT 6.1; WOW64)
3、默认的)语言等
第六行,这应该是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的内容就到这里了。希望可以帮助到大家!