当前位置 : 主页 > 网络编程 > 其它编程 >

HTTP笔记(二)

来源:互联网 收集:自由互联 发布时间:2023-07-02
HTTP首部不管是请求报文还是响应报文都会包含首部信息。HTTP首部都是由字段名和字段值构成的中间由英文冒号:隔开。一个首部字段名可以对应多个字段值 HTTP首部 不管是请求报文还是
HTTP首部不管是请求报文还是响应报文都会包含首部信息。HTTP首部都是由字段名和字段值构成的中间由英文冒号:隔开。一个首部字段名可以对应多个字段值

HTTP首部

不管是请求报文还是响应报文都会包含首部信息。HTTP首部都是由字段名和字段值构成的中间由英文冒号:隔开。一个首部字段名可以对应多个字段值。

四种首部字段的类型

  • 通用首部字段请求报文和响应报文都会是使用的首部。
  • 请求首部字段从客户端向服务器发送请求报文时使用的首部。补充了请求的附加内容客户端信息响应内容相关优先级等信息。
  • 响应首部字段从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容也会要求客户端添加额外的内容信息。
  • 实体首部字段针对请求报文和响应报文的实体部分使用的首部。补充了资源内容的更新时间等于实体有关的信息。

通用首部字段

Cache-Control

缓存控制相关。示例

Cache-Control: private,max-age0,no-cache

表示针对特定用户每次都需要重新访问服务器资源。max-age不为0则在过期之前不会重复访问。

Connection

控制不再转发给代理管理持久连接。

示例

GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: Upgrade

该请求用于websocket协议。

再例如

Connection: close

HTTP/1.1默认是长连接如果想明确需要断开连接指定首部字段Connection为close即可。对应的有Keep-Alive。

Upgrade

用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信其参数值可以用来指定一个完全不同的通信协议。

示例

GET /chat HTTP/1.1Host: server.example.comUpgrade: TLS/1.0, HTTP/1.1Connection: Upgrade

使用Upgrade字段时还必须额外指定Connection: Upgrade。

对于服务端来说收到带有Upgrade字段的请求可以用101 Switching Protocols状态码作为响应返回。

Date

表名创建报文的时间。示例

Date:Tue, 14 Mar 2017 14:18:34 GMT

Pragma

HTTP/1.1之前版本的遗留字段只用于客户端的请求中。示例

Pragma: no-cache

Trailer

记录了报文主体后还会有哪些首部字段。

Transfer-Encoding

规定传输报文主体时采用的编码方式。HTTP/1.1的传输编码方式仅对分块传输编码有效。示例

Transfer-Encoding: chunked

Via

用于追踪客户端与服务端的请求和响应报文的传输路径。示例

Via: cache11.l2nu17[0,200-0,H], cache7.l2nu17[0,0], kunlun6.cn36[0,304-0,H], kunlun4.cn36[0,0]

Warning

通常用于告知用户一些与缓存相关的警告信息。

请求首部字段

Accept

该字段可通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。

若想要给显示的媒体类型增加优先级则使用q来额外表示权重值并用分号;进行分割。当权重值的范围是01(可精确到小数点后3位)且1为最大值。另外不指定权重q值时默认权重位1.0。

示例

Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8

每个逗号分隔代表一个类型text/html、application/xhtmlxml和image/webp权重1.0application/xml权重0.9其它的权重0.8。

Accept-Charset

该字段可用来通知服务器用户代理支持的字符串及字符集的相对优先顺序。另外可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。

示例

Accept-Charset: iso-8859-5, unicode-1-1;q0.8

Accept-Encoding

该字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序可一次性制定多种内容编码。示例

Accept-Encoding: gzip, deflate, sdch

Accept-Language

该字段用来告知服务器用户代理能够处理的自然语言集。示例

Accept-Language: zh-CN,zh;q0.8,en;q0.6

Authorization

该字段用来告知服务器用户代理的认证信息即证书值。想要通过服务器认证的代理会在接收到返回的401状态码响应后把首部字段Authorization加入请求中。示例

Authorization: Basic YWRtaW46YWRtaW4

示例这里的加密串是用户名和密码的base64加密字符串。

一次典型的访问场景是

  • 浏览器发送http请求没有Authorization header
  • 服务器端返回401页面
  • 浏览器弹出认证对话框
  • 用户输入帐号密码并点确认
  • 浏览器再次发出http请求带着Authorization header
  • 服务器端认证通过并返回页面
  • 浏览器显示页面。
  • 使用HTTP Authorization的场景不会用COOKIE也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。由于种种缺点HTTP Authorization现在用的并不多。不过在路由器等场合还是有应用的原因是HTTP Authorization最简单使用起来几乎是零成本。 在你需要做访问控制又不想拖上SSO、数据库之类的东西的时候HTTP Authorization不失为一个简洁的选项。

    Expect

    该字段是客户端用来告知服务器期望出现的某种特定行为。如服务器无法理解客户端的期望则会发生错误返回状态码417。

    From

    该字段用来告知服务器使用用户代理的用户的电子邮件地址。目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时应尽可能包含From首部字段。

    Host

    多个虚拟主机可运行在同一个IP上因此需要使用Host首部字段加以区分。该字段用来告知服务器请求的资源所处的互联网主机名和端口号。

    示例

    GET / HTTP/1.1Host: server.example.com

    If-Match

    形如If-xxx的样式的请求首部字段都可以称之为条件请求。服务器接受到附带条件的请求时只有判断指定条件为真才会执行请求。

    If-Match首部字段属于附带条件之一它会告诉服务器匹配资源所用的实体标记(ETag)值。而这时的服务器无法使用弱ETag值。

    If-Modified-Since

    该字段用来告知服务器若If-Modified-Since字段值早于资源的更新时间则希望能处理该请求。而在制定的字段值的日期时间之后如果请求的资源都没有过更新则返回状态码304。

    示例

    If-Modified-Since: Fri, 15 Feb 2013 03:06:57 GMT

    If-None-Match

    该字段和If-Match字段作用相反。用于指定的字段值的实体标记ETag值与请求资源的ETag不同时就告知服务器处理该请求。

    If-Range

    该字段告知服务器若制定的字段值(ETag值或者时间)和请求资源的ETag值或时间相一致则作为范围请求处理。反之返回全体资源。下面对比If-Range和If-Match的不同

    使用If-Range字段时如果不一致时则忽略范围请求返回全部资源。而实用If-Match字段时如果不一致则需要再次进行请求处理。

    If-Unmodified-Since

    该字段和If-Modified-Since字段相反它的作用是告知服务器指定的请求资源只有在字段值哪指定的日期时间之后未发生更新的情况下才能处理请求。如果在指定日期时间后发生了更新则返回状态码412。

    Max-Forwards

    通过TRACE方法或OPTIONS方法时发送包含首部字段Max-Forwards的请求时该字段以十进制整数形式指定可经过的服务器最大数目。

    Proxy-Authorization

    接收到从代理服务器发来的认证质询时客户端会发送包含首部字段Proxy-Authorization的请求以告知服务器认证所需要的信息。认证行为发生在客户端与代理之间。客户端和服务器之间的认证实用首部字段Authorization可起到相同作用。

    Range

    对于只需要获取部分资源的范围请求包含首部字段Range即可告知服务器资源的制定范围。

    Referer

    该字段告知服务器请求的原始资源的URI。客户端一般都会发送Referer首部字段給服务器。

    但当直接在浏览器的地址栏输入URI或出于安全的考虑时也可以不发送该首部字段。因为原始资源的URI中的查询字符串可能含有ID和密码等保密信息要是写进Referer转发給其他服务器则有可能导致保密信息的泄露。

    示例

    Referer: http://www.cnblogs.com/xuxiang/p/3407539.html

    TE

    该字段告知服务器客户端能够处理响应的传输编码方式和相对优先级。它和首部字段Accept-Encoding的功能相似但是这是用于传输编码。

    User-Agent

    该字段会将创建请求的浏览器种类和用户代理名称等信息传达给服务器。由网络爬虫发起请求时有可能会在字段内添加爬虫作者的电子邮件地址。此外如果请求经过代理那么中间也可能被添加上代理服务器的名称。

    示例

    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36

    响应首部字段

    Accept-Ranges

    告知客户端服务器能否处理范围请求以指定获取服务器的某部分资源可指定的字段值分2种

    • bytes:可处理范围请求
    • none:不能处理范围请求

    示例

    Accept-Ranges: bytes

    Age

    告知客户端源服务器创建响应多久了单位s。若创建响应的是缓存服务器该字段指缓存后响应再次发起认证到认证完成的时间值此时必须加上首部字段Age。

    示例

    Age:12017054

    ETag

    告知客户端实体标识。

    这是一种将资源以字符串形式做唯一标识的一种方式服务器会为没份资源分配对应的ETag值。

    另外当资源更新时ETag值也需要更新

    ETag: "82e22293907ce725faf67773957acd12"

    强ETag值和弱ETag值

    • 强ETag值不论实体发生多么细微的变化都会改变其值

    ETag: "usagi-1234"

    • 弱ETag值

    只提示资源是否相同只有资源发生了根本改变产生差异才会改变ETag值此时会在字段值最开始处附加W/

    ETag: W/"usagi-1234"

    Location

    将响应接受方引导至某个与请求URI位置不同的资源。基本上该字段都会配合3xxRedirction的响应提供重定向的URI。示例

    Location: http://www.usagidesign.jp/sample.html

    Proxy-Authenticate

    把代理服务器所要求的认证信息发给客户端他的认证行为在客户端与代理间进行。示例

    Proxy-Authenticate: basic realm"Usagidesign Auth"

    Retry-After

    告知客户端在多久之后再次发送请求主要配合状态码503 Service Unavailable响应或者3XX Redirect响应一起使用。

    字段值可以指定具体的日期时间Wed, 04 Jul 2012 06: 34: 24 GMT等格式也可以是创建响应后的秒数。

    示例

    Retry-After: 120

    Server

    告知客户端当前服务器上安装的http服务器应用程序的信息。其中包含软件应用名称甚至版本号和安装时的启动项。示例

    Server: Tengine

    Vary

    控制缓存。源服务器向代理传达关于本地缓存使用方法的命令。客户端收到从代理服务器收到的从源服务器返回的包含该字段指定项的响应之后若再次进行缓存仅对请求中含有相同字段的请求返回缓存。

    示例

    Vary: Accept-Encoding

    WWW-Authenticate

    HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的查询。

    状态码401 Unauthorized响应中肯定包含该字段。

    实体首部字段

    Allow

    通知客户端能够支持的Request-URI指定资源的所有http方法。如果服务器接收到不支持的方法会返回状态码405Method Not Allowed作为响应返回。示例

    AllowGET, HEAD

    Content-Encoding

    告知客户端服务器对实体的主体部分的选用的内容编码方式。内容编码指在不丢失实体信息的前提下所进行的压缩。主要采用以下这四种内容编码方式

    • gizp
    • conpress
    • deflate
    • identity

    示例

    Content-Encoding: gizp

    Content-Lanuage

    告知客户端实体主体使用的自然语言优先接收的语言。示例

    Content-Lanuage: zh-CN

    Content-Length

    表明实体主体部分的大下单位是字节。若对实体主体进行编码传输不能使用该字段。示例

    Content-Length: 15000

    Content-Location

    给出了与报文主体部分相对应的URI。与Location不同该字段表示的是报文主体返回资源的URI。

    示例

    Content-Location: http://www.baidu/com/index-miss.html

    Content-MD5

    由一串由MD5算法生成的值其目的在于检查报文主体在传输中是否保持完整以及确认传输到达。 示例

    Content-MD5: OFJKGKLDFUIGNG35565FGNHLDGNH

    Content-Range

    告知客户端作为响应返回的实体的哪个部分符合范围请求单位字节表示当前发送部分及整个实体大小。示例

    Content-Range: bytes 5001-10000/10000

    Expires

    告知客户端资源失效的日期。如果首部字段存在Cache-Control有指定max-age指定时会优先处理max-age指令。示例

    Expires: Wed, 04 Jul 2016 09:26:05 GMT

    Last-Modified

    指明资源的最终修改的时间。示例

    Last-Modified: Wed, 04 Jul 2016 09:26:05 GMT

    COOKIE相关首部字段

    COOKIE的工作机制是用户识别及状态管理。

    实现原理方便管理用户状态通过web浏览器将一些数据临时写入用户的计算机内当用户访问时可通过通信方式取回之前发送的COOKIE。

    • expires 指定浏览器可发送COOKIE的有效期。若不指定则默认为会话时间段内。一旦COOKIE从服务端发送到客户端服务器就不存在可显式删除COOKIE的方法但可通过覆盖已过期的COOKIE实现对客户端的实质性删除。

    • path 用于限制指定COOKIE发送范围的文件目录。

    • domain 通过该属性指定的域名可做到与结尾匹配一致。

    • secure 限制web界面仅在HTTPS安全连接时才可以发送COOKIE。发送COOKIE时指定属性的方法如下

    Set-COOKIE: namevalue; secure

    • HttpCOOKIE COOKIE的扩展功能使Javascript脚本无法获得COOKIE。主要目的是为了防止跨站脚本攻击对COOKIE的信息窃取。发送指定HttpOnly属性的方法如下

    Set-COOKIE: namevalue; HttpOnly

    告知服务器客户端想获得http状态管理支持时就会在请求中包含从服务器接收到的COOKIE。接收多个时同样可以以多个发送。示例

    COOKIE: pgv_pvi7481519104; Hm_lvt_cc17b07fc9529e3d80b4482c9ce090861461665113

    其它首部字段

    由于HTTP首部字段可以自行扩展所以还有一些其他的非标准的首部字段。例如X-Frame-Options、X-XSS-Protection、DNT、P3P等等这里就不一一介绍了。

    参考 1、HTTP 教程 | 菜鸟教程http://www.runoob.com/http/http-tutorial.html 2、php中header函数参数的Cache-control:private,no-cache,must-revalidate,max-age是使用方法! - 斯世轻尘 - 博客园http://www.cnblogs.com/xuxiang/p/3407539.html 3、HTTP Authorization - \(firecat的代码足迹\) - 博客频道 - CSDN.NEThttp://blog.csdn.net/libaineu2004/article/details/38384487 4、http协议八请求首部字段 - IMyalost - 博客园http://www.cnblogs.com/imyalost/p/5726556.html 5、http协议九响应首部字段 - IMyalost - 博客园http://www.cnblogs.com/imyalost/p/5737024.html

    转:https://www.cnblogs.com/52fhy/p/6551408.html

    【文章转自 武汉网站设计公司 http://www.1234xp.com/wuhan.html 欢迎留下您的宝贵建议】
    网友评论