# HTTP Headers

# 1、简介

HTTP header允许客户端和服务器通过 HTTP 请求(request)或者响应(response)传递附加信息。一个 HTTP 标头由它的名称(不区分大小写)后跟随一个冒号(:),冒号后跟随它具体的值。

根据不同的消息上下文,标头可以分为:

  • [请求标头]包含有关要获取的资源或客户端或请求资源的客户端的更多信息。
  • [响应标头]包含有关响应的额外信息,例如响应的位置或者提供响应的服务器。
  • [表示标头]包含资源主体的信息,例如主体的 [MIME 类型]或者应用的编码/压缩方案。
  • [有效负荷标头]包含有关有效载荷数据表示的单独信息,包括内容长度和用于传输的编码。

头部信息的内容比较多, 只记录一些用过或者常用的意思。

# 2、验证

# 2.1 WWW-Authenticate

定义应该用于访问资源的身份验证方法。HTTP WWW-Authenticate 响应标头定义了 [HTTP 身份验证]的方法(“质询”),它用于获取特定资源的访问权限。 通俗的认为就是这是一个响应头 , 用于告知客户端可以用何种方式来获取需认证的资源。

# 2.2 Authorization

HTTP Authorization 请求标头用于提供服务器验证用户代理身份的凭据,允许访问受保护的资源。这个请求头就是用于请求需认证资源。比如你是token认证机制的设计, 你的Token就可以作为值放在这个头上传输

Authorization: Basic <token>

# 3、缓存相关

缓存相关的头可以查看文章http缓存

# 3.1 Age

Age 消息头里包含对象在缓存代理中存贮的时长,以秒为单位。.

# 3.2 Cache-Control

Cache-Control 通用消息头字段,被用于在 http 请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。

# 4、条件

# 4.1 Last-Modified

资源的最后修改日期,用于比较同一个资源的多个版本。它不如 ETag (opens new window) 准确,但在某些环境中更容易计算

# 4.2 ETag

标识资源版本的唯一字符串。

使用 If-Match (opens new window)If-None-Match (opens new window) 的条件请求使用此值来更改请求的行为。

# 4.3 If-Match

使请求有条件,并且仅当存储的资源与给定的 ETag 之一匹配时才应用该方法。

请求首部 If-Match 的使用表示这是一个条件请求。在请求方法为 GET (opens new window)HEAD (opens new window) 的情况下,服务器仅在请求的资源满足此首部列出的 ETag值时才会返回资源。而对于 PUT (opens new window) 或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。

# 4.4 If-None-Match

If-None-Match 是一个条件式请求首部。对于 GETGET (opens new window)HEAD (opens new window) 请求方法来说,当且仅当服务器上没有任何资源的 ETag (opens new window) 属性值与这个首部中列出的相匹配的时候,服务器端才会返回所请求的资源,响应码为 200 (opens new window) 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 ETag (opens new window) 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。

对于 GET (opens new window)HEAD (opens new window) 方法来说,当验证失败的时候,服务器端必须返回响应码 304(Not Modified,未改变)

# 4.5、If-Modified-Since

使请求有条件,并期望只有在给定日期后修改资源时才请求传输资源,也就是状态码是200, 返回最新一份的资源。仅当缓存过期时才用于传输数据。 如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 (opens new window) 响应,而在 Last-Modified (opens new window) 首部中会带有上次修改时间。

# 5、连接管理

# 5.1 Connection

Connection 通用标头控制网络连接在当前会话完成后是否仍然保持打开状态。如果发送的值是 keep-alive,则连接是持久的,不会关闭,允许对同一服务器进行后续请求。

# 5.2 Keep-Alive

Keep-Alive 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000

# 6、内容协商

# 6.1 Accept

Accept 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用MIME 类型 (opens new window)来表示。借助内容协商机制 (opens new window), 服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type (opens new window) 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个 CSS 层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。

Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8

# 6.2 Accept-Encoding

HTTP 请求头 Accept-Encoding 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 Content-Encoding (opens new window) 中通知客户端该选择。

Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *

# 6.3 Accept-Language

Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言

以上基本都是客户端告诉服务器自己可以接受什么形式内容。

# 7、Cookie

关于cookie可以查看Cookie

包含先前由服务器使用 Set-Cookie 标头发送存储的 HTTP cookie

将 cookie 从服务器发送到用户代理。

# 8、CORS跨域

有比较多概念,比如简单请求,预检请求,可以查看CORS

# 8.1 Access-Control-Allow-Origin

这是一个响应头, 告诉浏览器此次响应资源可以被共享。 也就是跨域的时候, 服务器会返回这个头部信息, 值域可以是*,也可以是发送方的域名。

Access-Control-Allow-Origin: https://xdyuan.cn/

指定一个来源(只能指定一个)。如果服务器支持多个来源的客户端,其必须以与指定客户端匹配的来源来响应请求。

如果要将将可能的 Access-Control-Allow-Origin 值限制在一组允许的源,需要服务器端的代码检查 Origin请求标头的值,将其与允许的来源列表进行比较,如果 Origin 值在列表中,将 Access-Control-Allow-Origin 设置为与 Origin标头相同的值。

# 8.2 Access-Control-Allow-Credentials

Access-Control-Allow-Credentials 响应头用于在请求要求包含 credentials(Request.credentials 的值为 include)时,告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码。

浏览器仅在响应标头 Access-Control-Allow-Credentials 的值为 true 的情况下将响应暴露给前端的 JavaScript 代码。

当作为对预检请求的响应的一部分时,这能表示是否真正的请求可以使用 credentials。注意简单的GET请求没有预检,所以若一个对资源的请求带了 credentials,如果这个响应头没有随资源返回,响应就会被浏览器忽视,不会返回到 web 内容。

Access-Control-Allow-Credentials 标头需要与 XMLHttpRequest.withCredentials (opens new window) 或 Fetch API 的 Request() (opens new window) 构造函数中的 credentials 选项结合使用。Credentials 必须在前后端都被配置(即 Access-Control-Allow-Credentials header 和 XHR 或 Fetch request 中都要配置)才能使带 credentials 的 CORS 请求成功。

# 8.3 Access-Control-Allow-Headers

响应头 Access-Control-Allow-Headers主要用于在预检请求中,指示真实请求可以使用的首部信息。

Access-Control-Allow-Headers: <header-name>[, <header-name>]*
Access-Control-Allow-Headers: *

# 8.4 Access-Control-Allow-Methods

指定对预检请求的响应中,哪些 HTTP 方法允许访问请求的资源。

Access-Control-Allow-Methods: POST, GET, OPTIONS

# 8.5 Access-Control-Expose-Headers

响应标头 Access-Control-Expose-Headers 允许服务器指示那些响应标头可以暴露给浏览器中运行的脚本,以响应跨源请求。

# 8.6 Access-Control-Max-Age

指示预检请求的结果能被缓存多久。

Access-Control-Max-Age: <delta-seconds>

delta-seconds 返回结果可以被缓存的最长时间(秒)

上限是24小时, 不同浏览器有些差异,默认值是5秒

# 8.7 Access-Control-Request-Headers

用于发起一个预检请求,告知服务器正式请求会使用哪些 HTTP 标头。

# 8.8 Access-Control-Request-Method

用于发起一个预检请求,告知服务器正式请求会使用哪一种HTTP方法

# 8.9 Origin

指示获取资源的请求是从什么源发起的。

# 9、下载

# 9.1 Content-Disposition

在常规的 HTTP 应答中,Content-Disposition 响应标头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。

multipart/form-data 类型的应答消息体中,Content-Disposition 通用标头可以被用在 multipart 消息体的子部分中,用来给出其对应字段的相关信息。各个子部分由在 Content-Type (opens new window) 中定义的边界(boundary)分隔。用在消息体自身则无实际意义。

Content-Disposition 标头最初是在 MIME 标准中定义的,HTTP 表单及 POST (opens new window) 请求只用到了其所有参数的一个子集。只有 form-data 以及可选的 namefilename 三个参数可以应用在 HTTP 上下文中。

作为消息主体的标头,在 HTTP 场景中,第一个参数或者是 inline(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是 attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将 filename 的值预填为下载后的文件名,假如它存在的话)。

Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"

作为多部分主题的表头,当使用 multipart/form-data 格式提交表单数据时,每个子部分(例如每个表单字段和任何与字段数据相关的文件)都需要提供一个 Content-Disposition 标头,以提供相关信息。标头的第一个指令始终为 form-data,并且还必须包含一个 name 参数来标识相关字段。额外的指令不区分大小写,并使用带引号的字符串语法在 = 号后面指定参数。多个参数之间使用分号(;)分隔。

Content-Disposition: form-data; name="fieldName"
Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"

根据响应头截取文件名

function getFileNameFromContentDisposition(disposition) {
  if (!disposition) return '';
  var filename = '';
  disposition = decodeURIComponent(disposition);
  /* 
  "filename" 和 "filename*" 两个参数的唯一区别在于,"filename*" 采用了  RFC 5987 中规定的编码方式。当 "filename" 和 "filename*" 同时出现的时候,应该优先采用 "filename*",假如二者都支持的话。
  */
  if (disposition.indexOf('attachment') !== -1) {
    var filenameRegex1 = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
    var filenameRegex2 = /filename\*?=([^']*'')?([^;]*)/;
    var matches1 = filenameRegex1.exec(disposition);
    var matches2 = filenameRegex2.exec(disposition);
    if (matches2 !== null && matches2[2]) {
      filename = matches2[2];
    } else if (matches1 !== null && matches1[1]) {
      filename = matches1[1];
    }
    if (filename) {
      filename = filename.replace(/['"]/g, '');
    }
  }
  return filename;
}

# 10、消息主体信息

以下都是一些响应主体的头部信息

# 10.1 Content-Length

Content-Length 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。

# 10.2 Content-Type

Content-Type 实体头部用于指示资源的 MIME 类型。表明媒体类型。

在响应中,Content-Type 标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行 MIME 查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 X-Content-Type-Options (opens new window) 设置为 nosniff

# 10.3 Content-Encoding

Content-Encoding 列出了对当前实体消息(消息荷载)应用的任何编码类型,以及编码的顺序。它让接收者知道需要以何种顺序解码该实体消息才能获得原始荷载格式。Content-Encoding 主要用于在不丢失原媒体类型内容的情况下压缩消息数据。

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
Content-Encoding: br

# 10.4 Content-Language

用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容。

# 10.5 Content-Location

Content-Location 首部指定的是要返回的数据的地址选项。最主要的用途是用来指定要访问的资源经过内容协商后的结果的 URL。

# 11、重定向

# 11.1 Location

Location 首部指定的是需要将页面重新定向至的地址。一般在响应码为 3xx 的响应中才会有意义。

上次更新: 1/22/2025, 9:39:13 AM