⭐ 觉得好用?收藏备用,下次直接打开
分类
方向
Cache-Control 通用 缓存

请求/响应都有,控制缓存策略。响应端常用 max-age(秒)+ public/private + must-revalidate;请求端用 no-cache 强制回源。

Cache-Control: public, max-age=3600, must-revalidate MDN ↗
ETag 响应 缓存

资源版本指纹(通常 hash),客户端下次带 If-None-Match 验证;强弱标志 W/"…" 表示弱比较。

ETag: W/"68b329da9893e34099c7d8ad5cb9c940" MDN ↗
Last-Modified 响应 缓存

资源最后修改的 GMT 时间,客户端下次用 If-Modified-Since 验证。精度只到秒,比 ETag 弱。

Last-Modified: Tue, 04 May 2026 08:30:00 GMT MDN ↗
Expires 响应 缓存

HTTP/1.0 遗留缓存过期点。如果同时有 Cache-Control: max-age 则被忽略。

Expires: Wed, 21 Oct 2026 07:28:00 GMT MDN ↗
Pragma 请求 缓存 已废弃

HTTP/1.0 遗留,等价于 Cache-Control: no-cache。仅为兼容老代理保留。

Pragma: no-cache MDN ↗
Vary 响应 缓存

声明响应内容随哪些请求头变化(典型:Accept-Encoding、Accept-Language、Cookie),CDN/浏览器据此分桶缓存。

Vary: Accept-Encoding, User-Agent MDN ↗
Age 响应 缓存

中间代理/CDN 加上的字段,表示该响应在缓存里已躺了多久(秒)。Age + 客户端等待时间 ≤ max-age。

Age: 120 MDN ↗
CDN-Cache-Control 响应 缓存

CDN 层缓存指令(与 Cache-Control 分开),让 CDN 长缓存而浏览器不缓存。Cloudflare/Fastly/Akamai 普遍支持。

CDN-Cache-Control: max-age=86400 MDN ↗
Origin 请求 CORS

浏览器自动添加,标识请求来自哪个 scheme://host:port。CORS 预检和实际请求都会带。

Origin: https://example.com MDN ↗

允许哪个 origin 访问。* 通配(不能与凭证一起用);具体值如 https://example.com 必须配合 Vary: Origin。

Access-Control-Allow-Origin: https://example.com MDN ↗

允许跨域请求带 Cookie/Authorization。设为 true 时 Allow-Origin 不能用 *,必须是具体 origin。

Access-Control-Allow-Credentials: true MDN ↗

预检响应字段,列出该资源允许的 HTTP 方法。逗号分隔。

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS MDN ↗

预检响应字段,声明非简单请求头白名单(如 Authorization、Content-Type=application/json)。

Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With MDN ↗

默认 JS 只能读 6 个简单响应头。该字段把额外的响应头暴露出去,例如自定义 X-Total-Count。

Access-Control-Expose-Headers: X-Total-Count, X-Request-Id MDN ↗

预检响应可被缓存的秒数,期间同源同请求不重复 OPTIONS。Chromium 上限 7200,Firefox 上限 86400。

Access-Control-Max-Age: 86400 MDN ↗

浏览器预检 OPTIONS 时自动加,告诉服务器实际请求会用什么方法。

Access-Control-Request-Method: PUT MDN ↗

浏览器预检自动加,告诉服务器实际请求会带哪些非简单头。

Access-Control-Request-Headers: content-type, authorization MDN ↗

声明资源能否被跨源页面 <img>/<script> 等加载。same-origin / same-site / cross-origin 三档。

Cross-Origin-Resource-Policy: same-site MDN ↗
Content-Security-Policy 响应 安全

限制页面可加载的资源源(脚本/样式/图片/iframe),抵御 XSS 与数据注入。多指令分号分隔。

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; img-src 'self' data: MDN ↗

与 CSP 同语法,但仅记录违规、不真的阻止;用于上线前 dry-run。配合 report-uri / report-to 收集报告。

Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report MDN ↗

让浏览器在 max-age 秒内一律走 HTTPS,杜绝降级。preload 申请加入浏览器预置列表。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload MDN ↗
X-Frame-Options 响应 安全

防点击劫持。DENY 全禁;SAMEORIGIN 仅同源。新代码建议改用 CSP frame-ancestors。

X-Frame-Options: SAMEORIGIN MDN ↗
X-Content-Type-Options 响应 安全

设为 nosniff 后浏览器严格按 Content-Type 处理资源,避免脚本被当作图片混淆执行。

X-Content-Type-Options: nosniff MDN ↗
Referrer-Policy 响应 安全

控制跨源跳转时 Referer 暴露多少。strict-origin-when-cross-origin 是当前推荐默认值。

Referrer-Policy: strict-origin-when-cross-origin MDN ↗
Permissions-Policy 响应 安全

控制页面/iframe 可使用的浏览器特性(摄像头、地理位置、剪贴板等)。前身是 Feature-Policy。

Permissions-Policy: camera=(), microphone=(self), geolocation=("https://example.com") MDN ↗
X-XSS-Protection 响应 安全 已废弃

老 IE/Chromium 的内置 XSS 反射过滤。现代浏览器已移除,建议直接禁用并依赖 CSP。

X-XSS-Protection: 0 MDN ↗

配 COEP 启用跨源隔离,恢复 SharedArrayBuffer / 高精度计时器。same-origin 是最严策略。

Cross-Origin-Opener-Policy: same-origin MDN ↗

要求所有嵌入的跨源资源声明 CORP/CORS,配合 COOP 启用跨源隔离。

Cross-Origin-Embedder-Policy: require-corp MDN ↗
Accept 请求 内容协商

客户端能处理的媒体类型清单,q 值表示偏好权重(0~1)。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 MDN ↗
Accept-Encoding 请求 内容协商

客户端支持的压缩算法。常见 gzip / deflate / br(Brotli)/ zstd(新)。

Accept-Encoding: gzip, deflate, br, zstd MDN ↗
Accept-Language 请求 内容协商

客户端首选语言列表,用于多语言内容协商。BCP 47 格式(如 zh-CN)。

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 MDN ↗
Accept-Charset 请求 内容协商 已废弃

历史遗留。现代浏览器固定 UTF-8,已停止发送该头。服务器可忽略。

Accept-Charset: utf-8, iso-8859-1;q=0.5 MDN ↗
Content-Type 通用 内容协商

响应/请求体的媒体类型,可附 charset 和 boundary(multipart)。POST 表单常见 application/json 或 application/x-www-form-urlencoded。

Content-Type: application/json; charset=utf-8 MDN ↗
Content-Encoding 响应 内容协商

响应体实际应用的压缩格式。客户端必须按反向解码。

Content-Encoding: br MDN ↗
Content-Language 响应 内容协商

响应内容的目标语言,BCP 47 标签(zh-Hans / en-US)。

Content-Language: zh-CN MDN ↗
Range 请求 范围请求

请求资源的某个字节区间(含起止)。视频拖动、断点续传基础。多个区间逗号分隔。

Range: bytes=0-1023 MDN ↗
Accept-Ranges 响应 范围请求

服务器声明支持的范围单位。bytes 表示支持字节级;none 表示不支持。

Accept-Ranges: bytes MDN ↗
Content-Range 响应 范围请求

配合 206 Partial Content。格式 bytes 起-止/总长度。

Content-Range: bytes 0-1023/146515 MDN ↗
If-Range 请求 范围请求

配合 Range:值匹配资源 ETag/Last-Modified 时返回 206,不匹配则整资源 200 重发。

If-Range: W/"68b329da9893" MDN ↗
If-Match 请求 条件请求

常用于 PUT/DELETE 防并发覆盖:仅当资源当前 ETag 匹配才执行,否则 412 Precondition Failed。

If-Match: "686897696a7c876b7e" MDN ↗
If-None-Match 请求 条件请求

与 ETag 配对的缓存验证:值匹配时服务器返回 304 Not Modified,节省带宽。

If-None-Match: W/"68b329da9893" MDN ↗
If-Modified-Since 请求 条件请求

与 Last-Modified 配对。若资源自指定时间未修改,返回 304。

If-Modified-Since: Tue, 04 May 2026 08:30:00 GMT MDN ↗
If-Unmodified-Since 请求 条件请求

常用于 PUT:资源自指定时间没改过才执行(防丢失更新)。否则 412。

If-Unmodified-Since: Tue, 04 May 2026 08:30:00 GMT MDN ↗
Authorization 请求 认证

常见 scheme:Basic(base64 用户:密码)、Bearer(OAuth/JWT 令牌)、Digest。

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... MDN ↗
WWW-Authenticate 响应 认证

配 401 Unauthorized 返回,告诉客户端使用什么认证 scheme 和 realm。

WWW-Authenticate: Bearer realm="api", error="invalid_token" MDN ↗
Proxy-Authorization 请求 认证

向 HTTP 代理服务器发送的凭证,格式同 Authorization。

Proxy-Authorization: Basic dXNlcjpwYXNz MDN ↗
Proxy-Authenticate 响应 认证

407 响应附带,提示客户端如何向代理认证。

Proxy-Authenticate: Basic realm="proxy" MDN ↗
Content-Length 通用 实体

消息体的精确字节数(不是字符数)。Transfer-Encoding: chunked 时不应同时出现。

Content-Length: 12345 MDN ↗
Content-Disposition 响应 实体

attachment 触发下载并指定默认文件名(filename* 用 RFC 5987 编码支持中文);inline 内联显示。

Content-Disposition: attachment; filename="report.pdf"; filename*=UTF-8''%E6%8A%A5%E5%91%8A.pdf MDN ↗
Content-Location 响应 实体

声明返回内容的实际位置,便于客户端为该 URL 缓存(不同于触发跳转的 Location)。

Content-Location: /article/12345.html MDN ↗
Transfer-Encoding 响应 实体

chunked 是流式分块传输(响应未知长度时常用)。HTTP/2/3 已废弃。

Transfer-Encoding: chunked MDN ↗
Upgrade 通用 WebSocket

客户端请求升级到指定协议(websocket / h2c)。需配合 Connection: Upgrade。

Upgrade: websocket MDN ↗
Connection 通用 WebSocket

keep-alive / close / Upgrade。HTTP/1.1 默认 keep-alive。HTTP/2/3 已废弃此头。

Connection: Upgrade MDN ↗
Sec-WebSocket-Key 请求 WebSocket

浏览器自动生成的 16 字节 base64 nonce,服务端配合返回 Sec-WebSocket-Accept。

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== MDN ↗
Sec-WebSocket-Accept 响应 WebSocket

由 Sec-WebSocket-Key 拼接 GUID 后 SHA-1 + base64 计算得到,确认握手完成。

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= MDN ↗
Sec-WebSocket-Protocol 通用 WebSocket

客户端候选 / 服务端实际选定的应用层子协议(如 graphql-transport-ws)。

Sec-WebSocket-Protocol: graphql-transport-ws MDN ↗
Host 请求 其他

HTTP/1.1 必填。同 IP 多虚拟主机靠它路由。HTTP/2 用 :authority 伪头取代。

Host: example.com:443 MDN ↗
User-Agent 请求 其他

浏览器/客户端身份字符串。各家浏览器为兼容历史塞了一长串假信息,解析建议用专门库。

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 MDN ↗
Referer 请求 其他

当前请求是从哪个页面发起的。受 Referrer-Policy 控制可被裁剪或省略。注意官方拼写少了一个 r。

Referer: https://example.com/article/123 MDN ↗
Server 响应 其他

后端服务器软件名/版本。**安全建议隐藏或改为通用值**,避免暴露版本信息便于攻击。

Server: nginx/1.27.0 MDN ↗
Date 响应 其他

服务器生成响应的 GMT 时间,必填头。HTTP/1.1 强制要求。

Date: Sun, 04 May 2026 12:00:00 GMT MDN ↗
Location 响应 其他

配 3xx 重定向使用,告诉客户端跳到哪个 URL;也用于 201 Created 返回新资源位置。

Location: https://example.com/new-path MDN ↗
Allow 响应 其他

配 405 Method Not Allowed 返回,列出该资源实际支持的方法。

Allow: GET, HEAD, POST, OPTIONS MDN ↗
Retry-After 响应 其他

配 429 / 503 / 3xx 使用。值可为秒数(120)或绝对 GMT 时间。

Retry-After: 120 MDN ↗
X-Forwarded-For 请求 其他

反向代理/负载均衡器追加,左侧最早的为原始客户端 IP,每跳追加。**易伪造,不可仅凭它做安全决策。**

X-Forwarded-For: 203.0.113.5, 198.51.100.1 MDN ↗
X-Forwarded-Proto 请求 其他

反代后端识别原始请求是 http 还是 https。Nginx 常用 $scheme 注入。

X-Forwarded-Proto: https MDN ↗
X-Forwarded-Host 请求 其他

反代后端拿到客户端原本访问的 Host(Host 此时已被改写为后端地址)。

X-Forwarded-Host: example.com MDN ↗
Forwarded 请求 其他

替代 X-Forwarded-* 系列的标准化头(RFC 7239),单条字段写完所有信息。

Forwarded: for=203.0.113.5;proto=https;host=example.com MDN ↗
X-Real-IP 请求 其他

Nginx 常用:proxy_set_header X-Real-IP $remote_addr。比 XFF 简单(单 IP 不追加),但同样易伪造。

X-Real-IP: 203.0.113.5
X-Request-Id 通用 其他 事实标准

入口生成、贯穿整个调用链的 trace ID,便于日志关联。无 RFC 但事实标准。

X-Request-Id: 7c1a3e4d-9b2f-4e8a-bf12-1234567890ab
X-Powered-By 响应 其他 已废弃

Express / PHP / ASP.NET 等默认输出。**建议关闭**,避免泄露版本和组件信息。

X-Powered-By: Express
DNT 请求 其他 已废弃

历史上让网站知道用户希望不被跟踪。各国/各厂商支持极差,多数主流浏览器已下线该字段。

DNT: 1
Sec-Fetch-Site 请求 其他

Fetch Metadata 系列:浏览器声明本请求是同源 / 同站 / 跨源 / 由用户输入触发。可用于服务端 CSRF 防御。

Sec-Fetch-Site: same-origin MDN ↗
Sec-Fetch-Mode 请求 其他

cors / no-cors / navigate / websocket / same-origin。配合 Sec-Fetch-* 让服务端识别请求场景。

Sec-Fetch-Mode: cors MDN ↗
Sec-Fetch-Dest 请求 其他

请求最终用于哪种资源(document / script / image / style / font 等)。

Sec-Fetch-Dest: document MDN ↗
Sec-Fetch-User 请求 其他

?1 表示用户主动操作(点击/回车),导航请求才有此字段。

Sec-Fetch-User: ?1 MDN ↗

HTTP 头完整速查——按 11 大类(缓存 / CORS / 安全 / Cookie / 内容协商 / 范围 / 条件 / 认证 / 实体 / WebSocket / 其他)整理 70+ 常用请求/响应头,每条给中文释义 + 典型示例值(一键复制)+ MDN 文档链接 + 锚点深链。

三类典型用法

场景重点关注的分类
排查 CORS 报错CORS 分类四件套 + Vary
上线前安全自检安全分类(CSP / HSTS / X-Frame-Options / Permissions-Policy)
缓存策略调优缓存分类(Cache-Control / ETag / Vary / Age)

阅读建议

  • 每行末尾的 MDN ↗ 跳转官方文档查最权威的细节
  • 点击 header 名(左侧大字)会复制带锚点的 URL,方便分享给同事
  • 「已废弃」红字标的是规范层面下线的(如 Pragma、X-XSS-Protection),新代码别再用
  • 「事实标准」紫字标的是没有 RFC 但业内一致采纳的(如 X-Request-Id)

姊妹工具:HTTP 状态码 / MIME 速查 覆盖状态码与媒体类型,本工具补 header 部分,配合使用可在排错时一站搞定。

📍使用场景

  • 排查 CORS 报错浏览器控制台报「has been blocked by CORS policy」时,对照 Access-Control-Allow-Origin / Allow-Methods / Allow-Headers / Allow-Credentials 四件套快速定位是后端漏配哪个头。
  • 上线前安全自检用 curl -I 看响应头,对照本工具的「安全」分类,确认 CSP / HSTS / X-Frame-Options / X-Content-Type-Options 是否齐全;缺哪个直接复制示例补到 Nginx/CDN 配置。
  • 缓存不命中调优CDN 命中率低时检查 Cache-Control / ETag / Vary,对比 Vary 字段是否过于宽松(带上 User-Agent 会导致几乎不命中)。
  • 设计 REST API 头设计上传/下载/范围请求/条件请求接口时一站查到 Range / If-Match / Content-Disposition 等的标准用法和典型值。
  • 反代转发头确认Nginx/Traefik/Caddy 后端拿不到客户端真实 IP 时,对比 X-Forwarded-For / Forwarded / X-Real-IP 三种方案的语义差异。

常见问题

自定义 header 还要不要加 X- 前缀?

RFC 6648(2012)已经废止 X- 前缀的推荐做法——但事实标准里几个老头依然广泛使用(X-Forwarded-For / X-Real-IP / X-Frame-Options)。新写应用时:(1) 直接用语义化名称,不要加 X-;(2) 业内已成事实标准的(X-Request-Id 等)继续用,避免和老中间件冲突;(3) IETF 注册新头要先在 IANA Provisional Header Registry 占位。实操原则:能用标准化的(Forwarded、Authorization、Content-Type)就别新造。

HTTP 头大小写敏感吗?

不敏感(RFC 9110 §5.1:field-name 是 case-insensitive token)。Content-Type / content-type / CONTENT-TYPE 在协议层等价。但工程实践中两点要注意:(1) HTTP/2 强制小写——HTTP/2 协议本身把 header 名都小写化传输,抓包看到的是 content-type;(2) 代码里用框架/语言原始写法——Express 的 req.headers 全是小写 key,Java Servlet 是 case-insensitive map,自己拼 header 时跟着惯例(每个单词首字母大写)保持可读性即可。

HTTP/2 / HTTP/3 还会用这些 header 吗?

绝大多数继续用,但有几个「连接层」头被替代或废弃:(1) Connection / Keep-Alive / Transfer-Encoding / Upgrade 在 HTTP/2 / HTTP/3 里禁止使用——多路复用让"连接"概念消失;(2) Host 被伪头 :authority 替代;(3) 请求行(Method/Path) 拆成 :method :path :scheme :authority 四个伪头。业务层 header(Cookie / Cache-Control / Content-Type / Authorization 等)完全沿用,无需改业务代码

一个响应可以有多个 Set-Cookie 吗?

可以,每条 Set-Cookie 单独占一行。这是 Set-Cookie 与其他 header 不同的特殊处理:HTTP 规范要求多值 header 用逗号合并,但 Cookie 的 Expires 字段恰好包含逗号(Tue, 04 May 2026),合并会破坏语义。所以服务端永远写多个 Set-Cookie 行,客户端把它们独立解析。Node.js 拿 res.getHeaders()["set-cookie"] 是数组,不是字符串。

Cache-Control 和 Expires 同时设了听谁的?

Cache-Control 优先级最高(RFC 9111)。如果响应里同时有 Cache-Control: max-age=3600Expires: Wed, 21 Oct 2026 07:28:00 GMT,所有现代 HTTP 缓存(浏览器、CDN、Squid)都看 Cache-Control 忽略 Expires。Expires 的存在意义:兼容 HTTP/1.0 老代理。新代码可以只写 Cache-Control,不必再写 Expires——除非你明确知道下游会经过 HTTP/1.0 代理(极少见)。

X-Forwarded-For vs Forwarded 怎么选?

新项目用 Forwarded(RFC 7239)——单条字段塞下原始 IP / 协议 / Host 三件套,少一次配置漏洞机会。事实情况是 X-Forwarded-* 系列仍是绝对主流:(1) 几乎所有反向代理默认输出 X-Forwarded-For/Proto/Host;(2) 框架/库(Spring、Express、Django)开箱识别 XFF;(3) 多层代理时 XFF 会自然追加成列表。安全提醒:XFF 可被客户端伪造,只信任最右侧未被你的代理重写的那段——具体哪一段取决于你部署了几层可信代理。

我设了 Access-Control-Allow-Origin 还是跨域报错?

七成是少配套字段。完整 CORS 套餐:(1) Allow-Origin 必须是具体 origin 或 *(带凭证时不能用 *);(2) Allow-Methods 列出实际允许的方法(OPTIONS 预检会读它);(3) Allow-Headers 必须包含客户端实际发的非简单头(Content-Type=application/json 也算非简单!);(4) Allow-Credentials: true 仅当 fetch 时显式 credentials: "include";(5) Vary: Origin 防 CDN 错误缓存。预检失败的典型表现:DevTools 看到一个 OPTIONS 请求 200/204 没问题,但实际请求被拦——说明响应缺 Allow-Headers 或拼写错。

HSTS preload 有什么坑?

preload 是单向门——一旦你提交到 Chrome 预置列表(hstspreload.org),所有支持的浏览器永久强制该域名走 HTTPS,撤回流程数月起步。上线前自查清单:(1) 全站(含子域)是否 100% 支持 HTTPS(preload 隐含 includeSubDomains);(2) 所有第三方依赖是否支持 HTTPS;(3) 邮件/API/老移动 App 是否还有 HTTP 调用;(4) 证书自动续期是否稳定。渐进策略:先发短期 max-age(300)→ 1 周 → 6 月 → 1 年 → 加 preload。每一步充分验证,不要一步到位 max-age=63072000。