文章目录
前言
上一篇文章介绍了:
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Authorization
Proxy Authorization
Expect
From
Host
Max-Forwards
10种头信息,本篇文章,将会介绍:
If-Match
If-Modified-Since
If-Unmodified-Since
If-None-Match
If-Range
Range
Refer
TE
8个头信息,话不多说,开始
1. If-Match
形如If-xxx
这种形式的请求首部字段,都可以称为条件请求。服务器接收到条件请求后,只有判断指定条件为真时,才会执行请求。
<!--语法-->
If-Match:<etage_value>
<!--例子-->
If-Match:"123456"
服务器会比对If-Match
的字段值和资源的ETag
值,仅当两者一致时,才会执行请求。否则返回412 Precondition Failed
状态码。
- 什么是ETag?
ETag是一个响应首部,代表资源的标识符,两个资源只要有一个字节不同,他们的ETag值就不同。在ETag值前加入W/
可采用弱比较算法:两个文件内容相同也算相同
2. If-Modified-Since
<!--语法,时间格式参见Date首部-->
If-Modified-Since:时间
<!--例子-->
If-Modified-Since:Sun, 17 Oct 2021 15:08:00 GMT
点击跳转:Date首部
此请求首部只能用在GET
或HEAD
请求中(虽然可能遵守的人很少)。其表示:若资源在其指定的时间之后更新了,则返回资源(状态码为200 OK
),否则返回状态码(304 Not Modified
)
3. If-Unmodified-Since
其与If-Modified-Since
的区别有:
- 资源在其指定的时间后没有进行修改才将资源返回
- 其可与
non-safe
方法如POST
搭配使用 - 如果发生了修改,则不返回资源,返回状态码
412 Precondition Failed
4. If-None-Match
<!--语法-->
If-None_Match:<etag_value>
<!--例子-->
If-None_Match:"123456"
该指令意思是:只有当请求资源的ETag
值与该字段的值不同时,才执行请求。
- 对于
GET
,HEAD
等获取资源的方法来说。其可以获取到最新的资源,与If-Modified-Since
类似。但匹配上时(请求资源的ETag
值与该字段的值不同),服务器会返回资源和状态码(200 OK
),当没有匹配上时,服务器返回状态码(304 Not Modified
) - 对于其他请求,只有匹配上,服务器才会执行响应的请求。
- 对于能够引发服务器状态改变的方法,比如
PUT
在服务器创建了一个文件,返回412 Precondition Failed
状态码
当与 If-Modified-Since
一起使用时,If-None_Match
优先级更高
5. If-Range
If-Range
需要搭配Range
首部一起使用。
<!--语法-->
If-Range: 时间(与Date首部格式一致)
If-Range: <etag>
其表示:若If-Range
后面的值为:
- 时间:在这个时间之后,资源没有改变,则
Range
首部起作用。 ETag
值:这个值和资源的ETag
值相同(资源没有改变),则Range
首部起作用
用
If-Match
或者Last-Modified
配合Range
不就行了,为啥还要If-Range
?
以If-Match
举例:如果If-Match
条件不满足,则服务器返回412 Precondition Failed
状态码,不会执行Range
的请求。
6. Range
其告知服务器:我不要资源的全部数据,我只要资源的一部分数据,你给我返回我要的那部分就行了。
<!--语法-->
Range: <unit>=<range-start>-
Range: <unit>=-<range-end>
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
<!--例子-->
Range: bytes= 5000- <!--从第5000个字节到最后一个字节-->
Range: bytes= -5000 <!--从第1个字节到第5000个字节-->
Range: bytes= 5000-10000 <!--从第5000个字节到第10000个字节-->
Range: bytes= 5000-10000, 12000- <!--从第5000个字节到第10000个字节和从第12000个字节到最后一个字节-->
- 如果服务器返回的是资源的一部分,则会返回状态码(
206 Partial Content
),对于一次从请求多个部分(Range: bytes= 5000-10000, 12000-
),服务器会以multipart
的形式返回什么是
multipart
?
点这里查看:Http之Multipart介绍 - 如果服务器发现请求范围不合法,比如
Range: bytes= 5000-100
,,则返回状态码416 Range Not Satisfiable
。如果服务允许Range
出错,则会返回整个资源的所有内容,并返回状态码:200 OK
7. Refer
其表明了当前请求是由那个页面发起的
<!--语法-->
Referer: <url>
<!--例子-->
Referer: http://www.example.com
服务端一般使用 Referer
请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
需要注意的是 referer
实际上是 referrer
误拼写
8. TE
- 用法一:与
Transfer-Encoding
一样,都表示传输编码。与它的区别是:Transfer-Encoding
:服务器传给客户端,告诉客户端->服务端采取的传输编码方式TE
:客户端传给服务端,告诉服务端->客户端能够处理的传输编码方式
- 用法二:
TE:trailers
希望服务端采用这种方式返回内容:... Transfer-Encoding:chunked Trailers:<header-names> ...
到此请求头信息介绍结束,下一篇将开始介绍响应头信息
关注我,获取最新的更新
下篇文章:Http头信息(三)——响应头信息(一)
Reference
[1]. HTTP Headers