跨域-CORS
是否允许跨域站点访问服务器的资源
// 指定允许访问该资源的域名,可以使用通配符 * 表示允许所有域名访问
Access-Control-Allow-Origin:'*'
// 指定允许的方法
Access-Control-Allow-Methods:'GET, POST, PUT, DELETE'
// 指定允许的HTTP头,如Content-Type、Authorization等
Access-Control-Allow-Headers:'Content-Type, Authorization'
在客户端发起跨域请求之前,浏览器会发送一个预检请求(OPTIONS请求)到服务器,以确定该服务器是否支持跨域请求。只有在服务器响应预检请求并允许跨域请求时,浏览器才会发送实际的跨域请求。 实际上,JavaScript本身是没有跨域限制的,跨域限制是由浏览器的安全策略所引入的。浏览器为了保护用户隐私和安全,对跨域资源的访问进行了限制。 浏览器限制了脚本通过XMLHttpRequest或Fetch API等方式访问来自不同源的资源,这就是所谓的同源策略。同源策略的基本原则是:不允许通过脚本访问来自不同源的资源,除非这些资源明确地允许跨域访问。同源策略要求脚本只能与与其来源协议、主机名和端口号相同的文档交互。
Cache-Control
可缓存性
public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age指令或Expires消息头;2. 该响应对应的请求方法是 POST 。)private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。no-cache
在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)。no-store
真正意义上的不缓存
到期
- max-age=
设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与Expires相反,时间是相对于请求的时间。
示例
禁止缓存
Cache-Control: no-store
缓存静态资源
Cache-Control:public, max-age=31536000
需要重新验证
Cache-Control: no-cache
Cache-Control: max-age=0, must-revalidate
Expires
Expires 响应头包含日期/时间(绝对时间),即在此时候之后,响应过期
如果在Cache-Control响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。
语法
Expires: <http-date>
示例
Expires: Wed, 21 Oct 2015 07:28:00 GMT
缓存策略
当请求资源时,如果本地有缓存,且max-age没有过期,就携带If-Modified-Since头部,发给服务器进行验证。
Last-Modified
表示资源的最后修改日期,它不如ETag
准确
Last-Modified: Wed, 24 Feb 2021 08:00:00 GMT
服务器收到请求后,会去查询对应文件的元数据[元数据中保存了文件最后一次被修改的时间],并与客户端传过来的值进行比较。比较之后会出现两种情况:
- 资源没有被修改,服务器会返回304,让客户端加载本地资源
HTTP/1.1 304 Not Modified
- 如果资源修改了,就返回200,把最新的内容和Last-Modified发给客户端
HTTP/1.1 200 No Content Last-Modified: Wed, 24 Feb 2021 08:00:00 GMT Cache-Control: max-age=60 body中包含请求的资源内容
ETag
标识资源版本的唯一字符串。使用 If-Match 和 If-None-Match 的条件请求使用此值来更改请求的行为
在使用ETag和Max-Age进行缓存控制时,优先级是ETag高于Max-Age。但是,Max-Age仍然非常重要,它可以在ETag验证失败时,告诉客户端缓存资源的有效期,避免客户端频繁向服务器请求资源
内容协商(Content negotiation)
Accept
通知服务器可以发回的数据类型
语法
Accept: <MIME_type>/<MIME_subtype>
Accept: <MIME_type>/*
Accept: */*
// Multiple types, weighted with the quality value syntax:
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
<MIME_type>/<MIME_subtype>
单一精确的 MIME 类型,例如text/html.<MIME_type>/*
一类 MIME 类型,但是没有指明子类。image/* 可以用来指代 image/png、image/svg、image/gif 以及任何其他的图片类型。*/*
任意类型的 MIME 类型
Accept-Encoding
通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 Content-Encoding 中通知客户端该选择
语法
Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
// Multiple algorithms, weighted with the quality value syntax:
Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
防盗链
服务器可以通过防盗链获得请求来源,从一定程序上避免非法请求
是指在网站A中引用了另一个网站B上的图片、视频、音频等资源,而不是将这些资源下载到自己的网站上并在自己的服务器上进行托管。这种行为会导致网站B的流量被消耗,而网站A则可以免费使用网站B的资源,因此被称为盗链
配置HTTP响应头部,只允许指定的域名或IP地址访问该资源。可以使用Referer或Origin请求头部来验证请求的来源。
Content-Disposition
指示内容该以何种形式展示
语法
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
inline
默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示attachment
消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将filename的值预填为下载后的文件名
示例
200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: attachment; filename="cool.html"
Content-Length: 22
<HTML>Save me!</HTML>
这个简单的 HTML 文件会被下载到本地而不是在浏览器中展示。浏览器默认会建议将cool.html作为文件名
消息主体信息
Content-Length
资源的大小,以十进制字节数表示。Content-Type
资源的媒体类型。Content-Encoding
压缩算法
代理
X-Forwarded-For
通过HTTP代理或负载均衡器(如nginx)连接到Web服务器的客户端的原始IP地址。X-Forwarded-Host
客户端用于连接到你的代理或负载均衡器的原始主机。
重定向
Location
指示要将页面重定向到的URL
请求上下文
Host
服务器的域名和TCP端口号。Referer
请求的来路,表示从xxx网站进行的请求User-Agent
响应上下文
Allow
列出资源所支持的 HTTP 方法的集合Server
包含了处理请求的源头服务器所用到的软件相关信息。
范围请求
Accept-Ranges
指示服务器是否支持范围请求,如果支持,范围可以用哪个单位表示Range
指示服务器应返回的文档部分If-Range
创建一个条件范围请求,只有在给定的 etag 或日期与远程资源匹配时才会满足。用于防止从资源的不兼容版本下载两个范围。Content-Range
指示部分消息在完整正文消息中的位置。