Skip to content

HTTP Header 自查表

Updated: at 14:10

之前面试的时候被问到,结果有些没答上来,现将常见 Header 汇总在此,方便自查。(大部分内容均来自 MDN 文档)

请求标头

Referer

Referer: https://www.baidu.com/?tn=15007414_8_dg

Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。(即跳转到此页面前点击的链接)

Accept

Accept: text/html, text/plain;charset=UTF-8, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8

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

常见 MIME 类型:

Accept-Encoding

Accept-Encoding: gzip, deflate, br

HTTP 请求头用于告诉服务器客户端支持的内容编码(压缩)方式。它的主要作用是实现 HTTP 压缩,可以减少传输数据的大小,从而提升网页加载速度。

常见的压缩方式:

Accept-Language

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

请求 HTTP 标头表示客户端所偏好的自然语言和区域设置。

User-Agent

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0

User-Agent 请求标头是一个特征字符串,使得服务器和对等网络能够识别发出请求的用户代理的应用程序、操作系统、供应商或版本信息。

示例 UA 基于 Edge 浏览器。

Sec-CH-UA

Sec-CH-UA: "Not A(Brand";v="8", "Chromium";v="132", "Microsoft Edge";v="132"

由于历史原因导致 UA 比较混乱,且存在不少缺点,网络标准商量出了此标头用于替代 UA。(原 UA 出于兼容历史浏览器原因仍然保留)

Sec-CH-UA 标头在以逗号分隔的列表中提供与浏览器关联的每个品牌的品牌和重要版本。品牌是用户代理的商业名称,例如:Chromium、Opera、Google Chrome、Microsoft Edge、Firefox 和 Safari。用户代理可能有多个关联的品牌。例如,Opera、Chrome 和 Edge 都基于 Chromium,并将在 Sec-CH-UA 标头中提供这两个品牌。

Sec-CH-UA 外,该系列标头还有更加精确的指定属性(表格来源):

标头范例值说明
Sec-CH-UA”Chromium”;v=“84”,“Google Chrome”;v=“84”浏览器品牌清单及其重要版本。
Sec-CH-UA-Mobile?1布尔值,指出浏览器是否在移动设备上(?1 代表 true)或否(?0 代表 false)。
Sec-CH-UA-Full-Version”84.0.4143.2”[已淘汰]浏览器的完整版本。
Sec-CH-UA-Full-Version-List”Google Chrome”;v=“84.0.4143.2”浏览器品牌及其完整版本清单。
Sec-CH-UA-Platform”Android”安装的平台,通常是操作系统(OS)。
Sec-CH-UA-Platform-Version”10”平台或 OS 的版本。
Sec-CH-UA-Arch”arm”安装的基础架构。仅当这可能与显示网页无关,不过网站会需要提供预设格式的下载项目。
Sec-CH-UA-Model”Pixel 3”安装型号。
Sec-CH-UA-Bitness”64”基础架构的位元程度(即整数或记忆体位址的大小,以位元为单位)

正常来说,由于 Sec-CH-UA 涉及用户隐私,需要通过与服务端的 Accept-CH 商定同意后发送,不过在 Chrome 89 以后一些与隐私无关的标头会在访问网站后自动发送:

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "macOS"

Connection

Connection: keep-alive
Connection: close

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

在 HTTP/2 和 HTTP/3 中,禁止使用特定于连接的标头字段,如 ConnectionKeep-Alive

Cookie: name=value; name2=value2; name3=value3

Cookie 是一个 HTTP 请求标头,其中含有先前由服务器通过 Set-Cookie 标头投放或通过 JavaScript 的 Document.cookie 方法设置,然后存储到客户端的 HTTP cookie 。

Host

Host: <host>:<port>
Host: developer.mozilla.org

HTTP Host 请求标头指定了接收请求的服务器的主机名和端口号。

如果没有包含端口,则默认使用请求服务的端口(例如,HTTPS URL 默认为 443,HTTP URL 默认为 80)。

所有 HTTP/1.1 请求消息中都必须发送一个 Host 标头字段。如果 HTTP/1.1 请求消息中缺少标头字段或包含多个 Host 标头字段,可能会发送 400 Bad Request 状态码。

Range

Range: bytes=200-1000, 2000-6576, 19000-

Range 指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分。主要用来断点续传。

X-Forwarded-For

X-Forwarded-For: client-ip, proxy1-ip, proxy2-ip

X-Forwarded-For (XFF) 是一个 HTTP 请求头,它的主要作用是追踪客户端请求的源 IP 地址链,在经过代理或负载均衡时特别重要。

工作原理:

  1. 当客户端直接访问服务器时,服务器可以直接获取客户端的 IP 地址
  2. 但当请求经过代理服务器时,服务器只能看到最后一个代理的 IP 地址
  3. X-Forwarded-For 会记录请求经过的所有 IP 地址,格式为逗号分隔的列表

Priority

Priority: u=3, i=1

Priority 标头允许客户端向服务器表明请求的相对优先级,帮助服务器优化资源的分配和传输顺序。

优先级值

响应标头

Access-Control

该系列标头与 CORS 跨域请求相关。所谓跨域请求,即运行在 https://domain-a.com 的 JavaScript 代码使用 XMLHttpRequest 来发起一个到 https://domain-b.com/data.json 的请求。

CORS (Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的 HTTP 头组成,这些 HTTP 头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。

Access-Control-Allow-Origin

# 允许所有资源访问
Access-Control-Allow-Origin: *
# 允许指定资源访问
Access-Control-Allow-Origin: https://abc.com

Access-Control-Allow-Methods

# 允许通过POST / GET / OPTIONS方法访问
Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Allow-Credentials

Access-Control-Allow-Credentials: true

Access-Control-Allow-Credentials 是一个重要的 CORS(跨源资源共享)响应头,主要用于控制跨域请求时是否允许发送身份凭证。

凭证信息包括:

前端 JavaScript 代码在请求要求包含 credentialsRequest.credentials 的值为 include)时,若 Access-Control-Allow-Credentials 设为 true,即表示服务器明确许可,身份凭证可以包含在请求中,浏览器会将请求响应返回给前端代码(前端 fetch 到相关 Cookie 等信息)。如果服务器不允许浏览器发送 Cookie 等身份凭证,删除该字段即可。如果 access-control-allow-origin*,当前字段就不能为 true

Access-Control-Allow-Headers

Access-Control-Allow-Headers: Authorization, Content-Type, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, X-Data-Type, X-Requested-With, X-Data-Type, X-Auth-Token, token

Access-Control-Allow-Headers 规定了允许带上的其他 Header 属性。Access-Control-Allow-Headers 仅在预检请求( OPTIONS )中使用。

CORS 预检请求用于检查服务器是否支持 CORS 协议,并且是否允许使用特定的方法和标头。

它一般是用了以下几个 HTTP 请求标头的 OPTIONS 请求:Access-Control-Request-MethodAccess-Control-Request-Headers,以及可选的 Origin 标头。

当有必要的时候,浏览器会自动发出预检请求;所以在正常情况下,前端开发者不需要自己去发这样的请求。预检请求会在请求被标记为“需要预检”时进行,而对于简单请求则不会进行。

例如,客户端可能会在实际发送 GET 请求之前,先向服务器发起预检请求,用于询问是否可以向服务器发起 GET 请求:

OPTIONS /resource/foo
Access-Control-Request-Method: GET
Access-Control-Request-Headers: Content-Type, x-requested-with
Origin: https://foo.bar.org

如果服务器允许,那么服务器就会响应这个预检请求。并且其响应标头 Access-Control-Allow-Methods 会将 GET 包含在其中:

HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Allow-Headers: Content-Type, x-requested-with
Access-Control-Max-Age: 86400

Cache-Control

Cache-Control 是一个 HTTP 协议中关于缓存的响应头,它由一些能够允许你定义一个响应资源应该何时、如何被缓存以及缓存多长时间的指令组成。当浏览器保存了资源的副本从而达到快速访问的目的的时候也就是 HTTP 发生了缓存。由于浏览器不需要每次都为了接收同一个文件而发起请求,访问这些资源副本就会非常快。

Vary

Vary: Accept-Encoding, Accept-Language, User-Agent

Vary 是一个 HTTP 响应标头,用于告诉缓存服务器(比如浏览器缓存、CDN)除了基本的请求 URL 之外,还需要基于哪些 HTTP 标头的值来区分缓存。它解决了”相同 URL 但需要不同响应内容”的场景。

上述例子中表示:告诉缓存服务器针对不同的压缩支持提供不同的缓存版本,基于用户的语言偏好提供不同的内容版本,根据设备类型提供不同的响应:移动设备获取移动版面、桌面设备获取桌面版面。

Expires

Expires: Wed, 21 Oct 2015 07:28:00 GMT

Expires 响应标头包含响应应被视为过期的日期/时间。 如果响应中有指令为 max-ages-maxageCache-Control 标头,则 Expires 标头会被忽略。

Last-Modified

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

Last-Modified 是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 ETag 要低,所以这是一个备用机制。

Transfer-Encoding

Transfer-Encoding: chunked

这是一个处理消息传输的编码方式,主要关注的是”如何传输数据”.

Server

Server: Apache/2.4.1 (Unix)

Server 标头描述了处理请求的源服务器(即生成响应的服务器)所使用的软件。

Server-Timing

Server-Timing: name;dur=value;desc="description"

Server-Timing 是一个 HTTP 响应头,允许服务器向客户端传递性能指标数据。这使得开发者可以监控和分析服务器端各个处理阶段的耗时情况。

Server-Timing 是一个强大的性能分析工具,它让开发者能够更好地了解和优化服务器端的性能表现。通过合理使用这个特性,可以建立更完善的性能监控体系,提供更好的用户体验。

Referer-Policy

Referrer-Policy: strict-origin-when-cross-origin

Referer-Policy 是一个 HTTP 头,用于控制在发送请求时 HTTP Referer 头部中包含多少 referrer(来源)信息。它帮助网站控制在用户导航或加载资源时如何传递来源信息。

具体细节可以查看:浅析 HTTP 请求中的 referrer 和 Referrer-Policy

Alt-Svc

Alt-Svc: <protocol-id>=<alt-authority>; ma=<max-age>; persist=1

Alt-Svc 全称为“Alternative-Service”,直译为“备选服务”。该头部列举了当前站点备选的访问方式列表。一般用于在提供“QUIC”等新兴协议支持的同时,实现向下兼容。

Content

Accept 相对,Content 系列标头是对 Accept 系列的回应,一般是从 Accept 给出的选择中选出其中之一,作为本次通信所采用的方式方法。

Content-Type

Content-Type: text/html; charset=utf-8

Content-Type 表示标头用于指示资源的原始媒体类型(在发送时应用任何内容编码之前)。

Content-Encoding

Content-Encoding: gzip

Content-Encoding 列出了对当前应用资源的任何编码类型,以及编码的顺序。它让接收者知道需要以何种顺序解码数据以获得 Content-Type 标头中描述的原始内容格式。内容编码主要用于在不丢失原媒体类型内容的情况下压缩内容。

一般建议服务器应对数据尽可能地进行压缩,并在适当情况下对内容进行编码。对一种压缩过的媒体类型如 .zip.jpeg 进行额外的压缩并不合适,因为这反而有可能会使内容增大。如果原始媒体以某种方式编码(例如 .zip 文件),则该信息不应该被包含在 Content-Encoding 标头内。

Content-Language

Content-Language: en-US

Content-Language 表示标头用来说明访问者希望采用的语言,这样的话用户就可以根据自己偏好的语言来定制不同的内容。

Content-Length

Content-Length: <length>

Content-Length 标头表示发送给接收方的消息体的大小(以字节为单位)。如此便可以在 HTTP 应用层层面对 TCP 字节流实现分包。

Content-Range

Content-Range: bytes 200-1000/67589

Content-Range HTTP 响应标头表示部分消息在完整消息中的位置。即对于请求标头中 Range 的回应。

Content-Security-Policy

Content-Security-Policy: script-src 'self'; object-src 'none';
style-src cdn.example.org third-party.org; child-src https:

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

具体内容可以参见:Content Security Policy 入门教程 - 阮一峰