HTTP请求报文及报文头含义

本文详细介绍了HTTP请求的报文结构,包括起始行中的请求方法、URL、协议版本,以及报文头中的重要字段如Host、Referer、User-Agent、Cookie、Content-Length、Content-Type等,同时还涵盖了Cache-Control和Accept-Encoding等与缓存和编码相关的设置。
摘要由CSDN通过智能技术生成

一、HTTP请求报文结构

二、起始行

①为请求方法,常见的有:GET、POST,此外还有DELETE、HEAD、OPTIONS、PUT、TRACE等,此处可能涉及到不安全的HTTP方法漏洞。

②为请求的URL地址,与报文头重的Host组成完整的URL。

③为HTTP协议及版本,目前主流版本是HTTP/1.1。

三、报文头

④为报文头,其中包含若干属性,其格式为“属性名:属性值”,服务器据此获取客户端信息。

与缓存相关的规则信息,均包含在header中。

请求报文头中的字段:

1.Host

给出了接收请求的服务器的主机名和端口号,可以是IP也可以是域名

在http1.1中不能缺少host字段,若确实服务器返回400 bad request,但host字段可为空值

而http1.0可以缺少host字段

2.Referer

表示这个请求是从哪个链接过来的

3.User-Agent

告诉网站服务器,访问者是通过什么工具来请求的

4.Accept

用于指定客户端可接受的内容类型。主要的目的就是告诉服务器,客户端能够接受的媒体类型,多个类型以逗号隔开,如果加权重的话以分号;隔开q=1,q的是指0-1最多三位小数的数字,默认是1。

*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type表示指定类型。

常见类型

文本类型 text/html, text/css

图片类型:image/png,image/jpg,image/gif

视频类型:video/mpeg,video/quitime

应用程序的二进制 : application/zip,applilcation/octet-stream

5.Cookie

HTTP最初是一个匿名、无状态的协议,Web 服务器几乎没有什么信息可以用来判定是哪个用户发送的请求,cookie 就是一些数据,用来存储会话信息,识别用户, 实现持久会话

Cookie 是由浏览器负责存储的,而不是操作系统。所以,它是“浏览器绑定”的,只能在本浏览器内生效。

Cookie字段有:[name] [value] [domain] [path] [expires/max-age] [size] [http] [secure] [sameSite]

name:存储在cookie中变量的名称。

value:存储在cookie中变量的值。

domain:域,cookie 对于哪个域是有效的。所有向该域发送的请求中都会包含这个 cookie 信息。

path:对于指定域中的那个路径,可以访问cookie;应该向服务器发送 cookie。如果同域不同路径,就不能访问该cookie。

expires:表示 cookie 何时应该被删除的时间戳。这个值是个 GMT 格式的日期,用于指定应该删除cookie 的准确时间。expires属性设置可能会出现误差,因为服务器时间与客户端时间可能不同。

max-age:默认单位是秒,用于规定n秒后Cookie过期。max-age的优先级比expires高,如果同时设置expires与max-age属性,那么max-age属性会生效。

size:此cookie的大小。

http:仅在HTTP层面上传输的cookie,设置了httpOnly后,客户端无法读写该cookie,能有效防御XSS攻击获取cookie。

secure:设置了secure标志的cookie仅在HTTPS层面上安全传输,如果请求的是HTTP,则不会发送这个cookie。设置了secure标志的cookie 客户端脚本是可以读写该cookie的。

sameSite:SameSite是Cookie最新增加属性,用于限制第三方Cookie,防止 CSRF 攻击和用户追踪。属性值有Strict,禁用任何第三方请求Cookie;Lax,对于第三方异步请求,则禁止第三方Cookie,对于第三方同步且是GET请求,则不禁止第三方Cookie;None,对于第三方请求的Cookie不做任何限制。

注:域、路径、失效时间和 secure 标志都是服务器给浏览器的指示,以指定何时应该发送 cookie。这些参数并不会作为发送到服务器的 cookie 信息的一部分,只有 name 和 value 才会被发送。

6.Content-Length

Content-Length是HTTP消息长度,用十进制数字表示的八位字节的数字。Content-Length字段指出报文中实体主体的字节大小。这个大小是包含了所有内容编码的。比如, 对文本文件进行了gzip压缩的话,Content-Length首部指的就是压缩后的大小而不是原始大小。( HTTP1.0中这个字段可有可无)

7.Content-Type

Content-Type:type/subtype ;parameter

type:主类型,任意的字符串,如text,如果是号代表所有;
subtype:子类型,任意的字符串,如html,如果是号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。

例:

Content-Type: text/html;
Content-Type: application/json;charset:utf-8;

(1)常见类型
①application/json

用来告诉服务端消息主体是序列化后的 JSON 字符串

②application/x-www-form-urlencoded

HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码。不支持文件,一般用于表单提交。

③multipart/form-data

与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。

(2)其他常见类型

text/html : HTML格式
text/plain :纯文本格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式

application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)

8.Accept-Language

用来告知服务器用户代理能够处理的自然语言集(指中文或者英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。

例:

Accept-Language: zh-cn, zh; q=0.7, en-us,en; q=0.3

采用权重q表示相对优先级,在上述例子中,客户端在服务器有中文版资源的情况下,会请求其返回中文版对象的响应,没有中文版时,则请求返回英文版响应。

9.Origin

指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。除了不包含路径信息,该字段与 Referer 字段相似。

10.Connection

这个字段只在HTTP1.1协议中存在。它决定了客户端和服务器进行了一次会话后,服务器是否立即关闭网络连接。在客户端最直接的表现是使用read方法(readLine方法也是一样)读完客户端请求的Web资源后,是否立即返回-1(readLine返回null)。

Connection有两个值:Close和Keep-Alive

当使用Connection:Close时,和HTTP1.0协议是一样的,当read方法读完数据时立即返回;而使用Connection:Keep-Alive时,read方法在读完数据后还要被阻塞一段时间。直接读取数据超时时间过后,还继续往下执行。

11.Cache-Control

Cache-Control的默认取值:private

指令作用
public表示响应可以被客户端和代理服务器缓存
private表示响应只可以被客户端缓存
max-age=30缓存30秒后就过期,需要重新请求
s-maxage=30覆盖max-age,作用一样,只在代理服务器中生效
no-store不缓存任何响应
no-cache资源被缓存,但是立即失效,下次会发起请求验证资源是否过期
max-stable30秒内,即使缓存过期,也使用该缓存
min-fresh希望在30秒内获取最新的相应

例:当Cache-Control:max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。

no-store

永远都不要在客户端存储资源,永远都去原始服务器去获取资源。

用来防止缓存和重新使用敏感信息,比如一个需要登录的网站,在浏览器缓存页面时,将会存储用户的登录信息,可能会导致用户之后访问时自动登录,因此登录页面可以使用No-Store 响应头来防止浏览器缓存,以保证安全性。

no-cache

可以在客户端存储资源,每次都必须去服务端做新鲜度校验,来决定从服务端获取新的资源(200)还是使用客户端缓存(304)。也就是所谓的协商缓存。

一般情况下对于 index.html 或者现代构建环境下不加 hash 的静态资源都需要设置 Cache-Control: no-cache,用来强制每次在服务器端的新鲜度校验,用来强制客户端每次访问都到服务端检查资源是否发生变化,比如一个拥有实时更新的新闻页面,可以使用 No-Cache 响应头来保证每次访问都可以获取到最新的新闻。相当于设置缓存头。            

12.Accept-Encoding

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

例:Accept-Encoding: gzip, deflate

下面列举一些内容编码:

  • gzip

由文件压缩程序 gzip(GUN zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称 CRC)

  • compress

由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法(LZW)。

  • deflate

组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。

  • identity

不执行压缩或不会变化的默认编码格式。

13.X-Forwarded-For

代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值