HTTP协议小结

HTTP/0.9
已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。

HTTP/1.0

这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1

当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

持久链接:1.1的Connection的默认值是keep-alive, 1.0默认值是close非持久链接

HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:

    缓存处理
    带宽优化及网络连接的使用
    错误通知的管理
    消息在网络中的发送
    互联网地址的维护
    安全性及完整性


统一资源标识符:
http://
username:passwd
@www.un.org
/subdir/file.html
?var=value&var2=value2
#hash

http://username:passwd@www.un.org/subdir/file.html?var=value&var2=value2#hash
其中#hash等额外参数 只能发送到前端浏览器,服务器获取不到, 可以用js获取 发送到服务器



HTTP/1.1协议中共定义了八种方法(也叫“动作”),方法名称是区分大小写的,来以不同方式操作指定的资源:

    OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

    HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部份(内容体)。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
        
    GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法  http规范是不超过255

    POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

    PUT:向指定资源位置上传其最新内容。成功返回201

    DELETE:请求服务器删除Request-URI所标识的资源。

    TRACE:回显服务器收到的请求,主要用于测试或诊断。

    CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

http格式规范:

每行,以 结束,header 、content 中间要有一空行

HTTP 请求
格式:
Request line
    GET       /dir/1.html   HTTP/1.1      
    请求方法  资源位置      协议版本
HTTP headers
     通用 header 、请求 header、实体 header
Content


HTTP Response
格式:
Status line
     HTTP/1.1 200 OK  

HTTP headers
    通用 header、响应 header、实体 header
Content
    <html>...</html>


响应值:
100-199:参考信息
200-299:成功
300-399:重定向
400-499:客户端错误
500-599:服务器错误


请求 header:
1,Accept:
   text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
   参数为 Content Type
   q 指定优先级[0-1],0为不接受,默认为1
   如果不指定 */* ,则其他类型优先级为0

   Accept表示浏览器支持的 MIME 类型;
   MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。
   text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。

2,Accept-Charset: 浏览器支持的字符编码
      utf-8;q=0.66,*;q=0.6

3,Accept-Encoding: 浏览器支持的压缩编码
      gzip,deflate,sdch

4,Accept-Language: 浏览器所支持的语言类型
      zh-CN,zh;q=0.8,en;q=0.6 优先顺序,中文简体,
      zh-cn表示简体中文;zh 表示中文

5,Authorization: 授权验证
    Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    401 Unauthorized

    使用HTTP AUTH需要在server端配置http auth信息(一般是webserver启动的时候从配置文件里面读取相关信息)。
    用中文简述一下http auth的过程:
    客户端发送http请求
    服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header
    如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。
    如果没有,或者用户密码不对,则返回http code 401页面给客户端
    标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header

    一次典型的访问场景是:
    浏览器发送http请求(没有Authorization header)
    服务器端返回401页面
    浏览器弹出认证对话框
    用户输入帐号密码,并点确认
    浏览器再次发出http请求(带着Authorization header)
    服务器端认证通过,并返回页面
    浏览器显示页面

    使用http auth的场景不会用cookie,也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。
    由于种种缺点,http auth现在用的并不多。不过在路由器等场合还是有应用的,原因是http auth最简单,使用起来几乎是零成本。

6,Cookie: HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
      version=1; skin=new;

      百度首页请求头中的cookie
      Cookie    BDUT=pfc827A04BCD53A0082260624BACA0F9A50A13b031e70272;
                MCITY=-131%3A; BAIDUID=16FFD38173B664490E853F05898831CA:FG=1;
        BDUSS=VibW5hdW53dk5iM0ZzekFBcUZiVGxaaHJxUUJ2Z2FzdGl2OHpuLUVSR2xGeUJUQVFBQUFBJCQAAAAAAAAAAAEAAACvU9En5~Hn9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWK-FKlivhSMT;
        H_PS_PSSID=5222_6552_6249_1455_5224_6582_6505_6477_4759_6017_6461_6428_6456_6501_6454_6529_6375;
        BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1


7,User-Agent: Mozilla/5.0 (compatible;域名)
  意思:使用的用户代理是 Mozilla/5.0 (compatible; 域名)。
  详解:
  User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
  Mozilla/5.0:Mozilla 是浏览器名,版本是 5.0;
  compatible(兼容的)表示平台是兼容模式;

8,Host: 域名
  Host表示请求的服务器网址;

9,TE: 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息
       trailers, deflate

10,Referer: 先前网页的地址,当前请求网页紧随其后,即来路 ,可用于防盗链
       http://www.sijiaomao.com/

11,Expect:指客户端要求的特殊服务器行为。若服务器不能理解或者满足 Expect域中的任何期望值,则必须返回417(Expectation Failed)状态
      100-continue

12,From:发出请求的用户的Email
      genesis@sijiaomao.com

14,If-Match:如果对象的 ETag 没有改变,其实也就意味着对象没有改变,才执行请求的动作
       "aetaghash"

15,If-None-Match: 如果对象的 ETag 改变了,其实也就意味着对象也改变了,才执行请求的动作。
       "aetaghash"

16,If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答,告诉浏览器该对象没有修改
       Sun, 11 May 2014 05:39:55 GMT

17,If-Unmodified-Since:如果请求的内容在指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
      Sun, 11 May 2014 05:39:55 GMT

18,If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。 浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
      "aetaghash"
      Sun, 11 May 2014 05:39:55 GMT

19,Max-Forwards:  限制信息通过代理和网关传送的时间
       2

20,Proxy-Authorization:连接到代理服务器的授权证书
     Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

21,Range:只请求实体的一部分,指定范围 成功返回206
      bytes=0-499, 1000-1499, 3000-


22,X-Requested-With: 在服务器端判断request来自Ajax请求还是传统请求
      XMLHttpRequest

23,X-Forwarded-For: 是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段

                                 中间代理服务器将客户端IP传递给服务器
      client1, proxy1, 192.168.2.125
      
      这一HTTP头一般格式如下:
      X-Forwarded-For: client1, proxy1, proxy2
      其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
      鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。



响应 header:
1,Accept-Ranges: 表明服务器是否支持指定范围请求及哪种类型的分段请求
       bytes

2,Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
       231

3,Content-Disposition: Content-Disposition 属性是作为对下载文件的一个标识字段
       attachment; filename="example.zip"

       Content-Disposition属性有两种类型:inline 和 attachment  
       inline :将文件内容直接显示在页面
       attachment:弹出对话框让用户下载具体例子   


4,ETag:请求变量的实体标签的当前值,对象被修改,ETag也会改变,主要供服务器 判断一个对象是否改变了。
       "abcdthisisatag"

5,Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源
       http://www.un.org

6,Refresh: 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
       3; url=http://www.sijiaomao.com/

7,Retry-After:  如果实体暂时不可取,通知客户端在指定时间之后再次尝试
       Tue, 15 Nov 2014 08:12:31 GMT
       200

8,Server:web服务器软件名称
       "Apache/2.4.2 (Unix)"

9,Set-Cookie:  设置Http Cookie

      操作中遇到下面问题

      secure=0/false    360,chrome创建不了cookie,火狐能创建 但issecure是true
      issecure=0/false  火狐,360,chrome 都正常

      解释:

secure httponly 这两个都是只加指令就行,不用赋值

也就是说 不用设置 secure=0 或 secure=false 
只要有 secure, 那就是只有https才会有效,没有 secure,那就是httphttps 都有效
secure 只是限制只能通过https发送回服务器,火狐在有secure时 http下能创建cookie 但不能使用
HttpOnly  也是,不带赋值的
例如  Set-Cookie: var=val; Domain=example.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly


      name=cat; domain=.sjm.org; path=/; expires=Tue, 21 May 2014 12:34:56 GMT; secure; httponly

      name=cat, 需要设置cookie的值(name不能使用“;”和","号),有多个name值时用";"分隔例如:name1=name1; name2=name2
      expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
      path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如:path="/cgi-bin/",

                        如 果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。
      domain=domain: 对cookie生效的域名,例如:domain="gzdzw.51.net"
      secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。

      httponly,禁止js获取cookie值



10,Vary:告诉下游代理是使用缓存响应还是从原始服务器请求
       Accept-Language, User-Agent

       Vary: Accept-Encoding 告知缓存代理服务器,客户端请求中发送了不同的 Accept-Encoding 就要缓存不同的版本

       Vary: User-Agent 不合理该禁止,例如不同的浏览器请求相同的内容 会缓存不同的版本





通用 header

1,Cache-Control: Cache-Control指定请求和响应遵循的缓存机制
      max-age=600, no-cache="Set-Cookie"

     no-cache="xxx":缓存,但在发回客户端前先作检查,传值则表示不缓存指定的header

     no-store:不缓存任何内容,在IE中=no-cache。

     max-age=120: 缓存最大有效期,秒(Age response header)

     max-stale=600:在缓存过期后还可以继续保存600秒,不赋值则表示可一直有效

     no-transform:禁止缓存代理修改内容

     only-if-cached: 禁止缓存代理访问应用服务器,仅在有缓存时返回内容。

     public: 任何客户端(代理服务器或浏览器)均可缓存

     private: 仅限私有客户端(一般是浏览器)可缓存内容

     must-revalidate: 必须重新验证缓存有效性(默认行为),此指令目的在于显式指明

     proxy-revalidate:代理服务器需要重新验证缓存有效性,浏览器不需要

     s-maxage:指定public客户端上的maxage,private 上忽略。



      在请求消息或响应消息中设置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。
      网页的缓存通过HTTP消息头中的“Cache-control”来控制,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。

      其作用根据不同的重新浏览方式分为以下几种情况:
      (1)打开新窗口如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如: Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器。
      (2)在地址栏回车如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
      (3)按后退按扭如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问。
      (4)按刷新按扭无论为何值,都会重复访问 当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。


2,Connection: Keep-Alive
  Connection表示客户端与服务连接类型;
  Keep-Alive,表示持久连接;
    close,请求一次后立即关闭

3,Date: 原始服务器消息发出的时间
     Tue, 21 May 2002 12:34:56 GMT

4,Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝,相当于 Cache-Control: no-cache。
     no-cache

5,Keep-Alive:持久连接、连接重用
     300

6,Trailer: 指出头域在分块传输编码的尾部存在
Date
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
Trailer: Date

05
line1
05
line2
0
Date: Tue, 21 May 2012 12:34:56 GMT

7,Transfer-Encoding: 文件传输编码
     chunked(分块)

8,Upgrade: 允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用。
        HTTP/2.0
        TLS/1.0

9,Via: 通知中间网关或代理服务器地址,通信协议
      192.168.11.12, example.com
      proxy1, proxy2


10,Warning:     关于消息实体的警告信息,服务器给客户端发个警告信息
      199 Miscellaneous warning
      110 Response is stale
      112 Disconnected operation
      ...




实体 header

1,Allow: 对某网络资源的有效的请求行为,不允许则返回405
     GET, HEAD, POST

2,Content-MD5: 返回资源的MD5校验值
      ZTFmZDA5MDYyYTMzZGQzMDMxMmIxMjc4YThhNTMyM2I=

3,Content-Range:在整个返回体中本部分的字节位置
      600-900/1234

4,Content-Encoding: web服务器支持的返回内容压缩编码类型。
      gzip

5,Content-Language:响应体的语言
      zh_CN

6,Content-Length:响应体的长度
      8848

7,Expires: 响应过期的日期和时间
      Tue, 21 May 2016 12:34:56 GMT

8,Last-Modified:请求资源的最后修改时间
      Tue, 21 May 2013 12:34:56 GMT

原文地址:https://www.cnblogs.com/dytl/p/3739480.html