Hypertext Transfer Protocol(HTTP)协议(RFC7230)
一种无状态的、应用层、以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。
Request-line = method SP request-target SP HTTP-version CRLF
GET:主要的获取信息方法,大量的性能优化都针对该方法,幂等方法
HEAD:类似GET方法,但服务器不发送BODY,用以获取HEAD元数据,幂等方法
POST:常用于提交HTML FORM表单、新增资源等
PUT:更新资源,带条件时是幂等方法
DELETE:删除资源,幂等方法
CONNECT:建立tunnel隧道
OPTIONS:显示服务器对访问资源支持的方法,幂等方法
TRACE:回显服务器收到的请求,用于定位问题。有安全风险
origin-form:后端请求资源的路径,为空时传递/
absolute-form:用于正向代理
authority-form:用于CONNECT方法
asterisk-form:用于OPTIONS方法
HTTP/0.9:只支持GET,已过时
HTTP/1.0:RFC1945,1996,常见使用于代理服务器(例如NGINX默认配置)
HTTP/1.1:RFC2616,1999
HTTP/2.0:2015.5 正式发布
Status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
Reason-phrase=*(HTAB/SP/VCHAR/obs-text)
响应码规范:RFC6585(2012.4) RFC7231 (2014.6)
1xx:请求已经收到,需要进一步处理才能完成,HTTP1.0不支持
2xx:成功处理请求
3xx:重定向使用Location指向的资源或者缓存中的资源。在RFC2068中规定客户端重定向次数不应超过5次,以防止死循环
4xx:客户端出现错误
5xx:服务器端出现错误
connection:keep-alive 长连接(HTTP/1.1默认使用长连接,keep-alive无意义)
connection:close 短连接
HTTP/1.1规范要求,不传递Host头部则返回400错误响应码
host头部用于http消息在服务器端路由
Host头部与消息的路由
1、建立TCP连接
确定服务器的IP地址
2、接收请求
3、寻找虚拟主机
匹配Host头部与域名
4、寻找URI的处理代码
匹配URI
5、执行处理请求的代码
访问资源
6、生成HTTP响应
各中间件基于PF架构串行修改响应
7、发送HTTP响应
8、记录访问日志
X-Forwarded-For:用于代理服务器传递IP
X-Real-IP:用于传递用户IP
Max-Forwards:限制Proxy代理服务器的最大转发次数,仅对TRACE/OPTIONS方法有效
Via:指明经过的代理服务器名称及版本
Cache-Control:禁止代理服务器修改响应包体
User-Agent:指明客户端的类型信息,服务器可以据此对资源的表述做抉择
Referer:浏览器对来自某一页面的请求自动添加的头部
From:主要用于网络爬虫,告诉服务器如何通过邮件联系到爬虫的负责人
Server:指明服务器上所用软件的信息,用于帮助客户端定位问题或统计数据
Allow:告诉客户端,服务器上该URI对应的资源允许哪些方法的执行
Accept-Ranges:告诉客户端服务器上该资源是否允许range请求(允许服务器基于客户端的请求只发送响应包体的一部分给到客户端,而客户端自动将多个片段的包体组合成完整的体积更大的包体)
Accept-Encoding:内容编码,主要指压缩算法协商
Accept-Language:语言协商
Content-type:资源表述,媒体类型、编码
Content-encoding:资源表述,内容编码
Content-Language:资源表述,语言
Content-Length:使用Content-Length头部明确指出包体长度
Transfer-Encoding:指明使用Chunk 传输方式,含Transfer-Encoding 头部后Content-Length头部应被忽略
TE头部:客户端在请求在声明是否接受Trailer头部
Trailer头部:服务器告知接下来chunk包体会传输哪些Trailer头部
以下头部不允许出现在Trailer 的值中:
用于信息分帧的首部(例如Transfer-Encoding 和Content-Length)
用于路由用途的首部(例如Host)
请求修饰首部(例如控制类和条件类的,如Cache-Control, Max-Forwards, 或者TE)
身份验证首部(例如Authorization或者Set-Cookie)
Content-Encoding, Content-Type, Content-Range, 以及Trailer 自身
disposition-type =" inline"|" attachment"| disp-ext-type
inline: 指定包体是以inline 内联的方式,作为页面的一部分展示
attachment: 指定浏览器将包体以附件的方式下载
在multipart/form-data类型应答中,可以用于子消息体部分
Cookie-header:Cookie头部中可以存放多个name/value 名值对
Set-Cookie:Set-Cookie头部一次只能传递1个name/value名值对,响应中可以包含多个头部
Access-Control-Request-Method:在preflight预检请求(OPTIONS)中,告知服务器接下来的请求会使用哪些方法
Access-Control-Request-Headers:在preflight预检请求(OPTIONS)中,告知服务器接下来的请求会传递哪些头部
Access-Control-Allow-Methods:在preflight预检请求的响应中,告知客户端后续请求允许使用的方法
Access-Control-Allow-Headers:在preflight预检请求的响应中,告知客户端后续请求允许携带的头部
Access-Control-Max-Age:在preflight预检请求的响应中,告知客户端该响应的信息可以缓存多久
Access-Control-Expose-Headers:告知浏览器哪些响应头部可以供客户端使用,默认情况下只有Cache-Control.、Content-Language、Content-Type、Expires、 Last-Modified、Pragma 可供使用
Access-Control-Allow-Origin:告知浏览器允许哪些域访问当前资源, *表示允许所有域。 为避免缓存错乱,响应中需要携带Vary: Origin
Access-Control-Allow-Credentials:告知浏览器是否可以将Credentials暴露给客户端使用,Credentials包含cookie、 authorization类头部、TLS证书等。
Etag:给出当前资源表述的标签
Last-Modified:表示对应资源表述的上次修改时间
验证请求
若缓存响应中含有Last-Modified头部
If-Unmodified-Since
If-Modified-Since
If-Range
若缓存响应中含有Etag头部
If-None-Match
If-Match
If-Range
Age:Age表示自源服务器发出响应(或者验证过期缓存) ,到使用缓存的响应发出时经过的秒数
Cache-Control:缓存控制头部
Cache-Control头部在请求中的值
Max-age:告诉服务器,客户端不会接受Age超出max-age秒的缓存
Max-stale:告诉服务器,即使缓存不再新鲜,但陈旧秒数没有超出max-stale时,客户端扔打算使用。若max-stale后没有值,则表示无论过期多久客户端都可使用
Min-fresh:告诉服务器,Age至少经过min-fresh秒后缓存才可使用
No-cache:告诉服务器,不能直接使用已有缓存作为响应返回,除非带着缓存条件到上游服务端得到304验证返回码才可使用现有缓存
No-store:告诉各代理服务器不要对该请求的响应缓存(实际有不少不遵守该规定的代理服务器)
No-transform:告诉代理服务器不要修改消息包体的内容
Only-if-cached:告诉服务器仅能返回缓存的响应,否则若没有缓存则返回504错误码
Cache-Control头部在响应中的值
Must-revalidate:告诉客户端一旦缓存过期,必须向服务器验证后才可使用
Proxy-revalidate:与Must-revalidate类似,但它仅对代理服务器的共享缓存有效
No-cache:告诉客户端不能直接使用缓存的响应,使用前必须在源服务器验证得到304返回码。如果no-cache后指定头部,则若客户端的后续请求及响应中不含有这些头则可直接使用缓存
Max-age:告诉客户端缓存Age超出max-age秒后则缓存过期
S-maxage:与max-age相似,但仅对共享缓存,且优先级高于max-age和Expires
public:表示无论私有缓存或者共享缓存,皆可将该响应缓存
private:表示该响应不能被代理服务器作为共享缓存使用。若private后指定头部,则在告诉代理服务器不能缓存指定的头部,但可缓存其他部分
No-store:告诉所有下游节点不能对响应进行缓存
No-transform:告诉代理服务器不能修改消息包体的内容
Location :当浏览器接收到重定向响应码时,需要读取响应头部Location头部的值,获取到新的URI再跳转访问该页面
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。