关于HTTP Header的讨论
关于HTTP Header的讨论
梦回雪夜观花 发表于4年前
关于HTTP Header的讨论
  • 发表于 4年前
  • 阅读 4416
  • 收藏 339
  • 点赞 24
  • 评论 13

腾讯云 技术升级10大核心产品年终让利>>>   

                    关于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.1path就是

 “/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.


剩下的部分每行都是一个“NameValue”对。它们包含了各式各样关于请求和你浏览器的信息

    第二行,字段如下 它指明了主机的名称很显然这是Googleweb服务器;


    第三行,字段如下它表明了链接状态

        如果为close 则表示告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了

        Keepalive 则表示告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求。

        Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive300


    第四行,

        是在告诉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请求头,响应会以状态码206PartialContent)返回而不是以200OK)。

 

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

服务器错误

                下面是详细更的解释    

   I1XX信息状态码

状态码

 状态消息

 含义

100

Continue(继续)

收到了请求的起始部分,客户端应该继续请求

101

Switching Protocols(切换协议)

服务器正根据客户端的指示Update Header)切换协议

  II2XX成功状态码

状态码

状态消息

含义

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(部分内容)

 部分请求成功             

  III3XX成功状态码

状态码

状态消息

含义

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-cacheno-storemax-agemax-stalemin-freshonly-if-cached,响应消息中的指令包括publicprivateno-cacheno-storeno-transformmust-revalidateproxy-revalidatemax-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的内容就到这里了。希望可以帮助到大家!

 


共有 人打赏支持
粉丝 9
博文 13
码字总数 16693
评论 (13)
苏生不惑
慢慢看
wdt
不错
☆冰山一角☆
第6行http://stackoverflow.com/questions/12183575/what-is-following-header-for-x-chrome-variations
MrDing
HTTP,不错
ojs
写得很详细啊!收藏了~
wenshao
淘宝是基于tengine,ngnix的一个变种
钛元素

引用来自“wenshao”的评论

淘宝是基于tengine,ngnix的一个变种

专门为了大数据量访问
梦回雪夜观花

引用来自“wenshao”的评论

淘宝是基于tengine,ngnix的一个变种

恩,一个网站一开始基本上都是用Apache的,随着自己业务慢慢做大就会开发更适合自己的,多谢提醒,大家一起学习了
Glide
HTTP Analyzer好用吗?
Mybrc91
不错
封狼丶居胥
mark
wolfy123
阿More
学习,收藏
×
梦回雪夜观花
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: