请求/响应都有,控制缓存策略。响应端常用 max-age(秒)+ public/private + must-revalidate;请求端用 no-cache 强制回源。
Cache-Control: public, max-age=3600, must-revalidate MDN ↗ 请求/响应都有,控制缓存策略。响应端常用 max-age(秒)+ public/private + must-revalidate;请求端用 no-cache 强制回源。
Cache-Control: public, max-age=3600, must-revalidate MDN ↗ 资源版本指纹(通常 hash),客户端下次带 If-None-Match 验证;强弱标志 W/"…" 表示弱比较。
ETag: W/"68b329da9893e34099c7d8ad5cb9c940" MDN ↗ 资源最后修改的 GMT 时间,客户端下次用 If-Modified-Since 验证。精度只到秒,比 ETag 弱。
Last-Modified: Tue, 04 May 2026 08:30:00 GMT MDN ↗ HTTP/1.0 遗留缓存过期点。如果同时有 Cache-Control: max-age 则被忽略。
Expires: Wed, 21 Oct 2026 07:28:00 GMT MDN ↗ HTTP/1.0 遗留,等价于 Cache-Control: no-cache。仅为兼容老代理保留。
Pragma: no-cache MDN ↗ 声明响应内容随哪些请求头变化(典型:Accept-Encoding、Accept-Language、Cookie),CDN/浏览器据此分桶缓存。
Vary: Accept-Encoding, User-Agent MDN ↗ 中间代理/CDN 加上的字段,表示该响应在缓存里已躺了多久(秒)。Age + 客户端等待时间 ≤ max-age。
Age: 120 MDN ↗ CDN 层缓存指令(与 Cache-Control 分开),让 CDN 长缓存而浏览器不缓存。Cloudflare/Fastly/Akamai 普遍支持。
CDN-Cache-Control: max-age=86400 MDN ↗ 浏览器自动添加,标识请求来自哪个 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 ↗ 限制页面可加载的资源源(脚本/样式/图片/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 ↗ 防点击劫持。DENY 全禁;SAMEORIGIN 仅同源。新代码建议改用 CSP frame-ancestors。
X-Frame-Options: SAMEORIGIN MDN ↗ 设为 nosniff 后浏览器严格按 Content-Type 处理资源,避免脚本被当作图片混淆执行。
X-Content-Type-Options: nosniff MDN ↗ 控制跨源跳转时 Referer 暴露多少。strict-origin-when-cross-origin 是当前推荐默认值。
Referrer-Policy: strict-origin-when-cross-origin MDN ↗ 控制页面/iframe 可使用的浏览器特性(摄像头、地理位置、剪贴板等)。前身是 Feature-Policy。
Permissions-Policy: camera=(), microphone=(self), geolocation=("https://example.com") MDN ↗ 老 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 ↗ 客户端把当前域名的所有 Cookie 拼成一行发回。多个键值 ; 分隔。
Cookie: sessionid=abc123; theme=dark MDN ↗ 服务器下发 Cookie。属性:Expires/Max-Age 失效;Domain/Path 作用域;Secure/HttpOnly 安全;SameSite 防 CSRF。
Set-Cookie: sid=abc123; Max-Age=86400; Path=/; Secure; HttpOnly; SameSite=Lax MDN ↗ 客户端能处理的媒体类型清单,q 值表示偏好权重(0~1)。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 MDN ↗ 客户端支持的压缩算法。常见 gzip / deflate / br(Brotli)/ zstd(新)。
Accept-Encoding: gzip, deflate, br, zstd MDN ↗ 客户端首选语言列表,用于多语言内容协商。BCP 47 格式(如 zh-CN)。
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 MDN ↗ 历史遗留。现代浏览器固定 UTF-8,已停止发送该头。服务器可忽略。
Accept-Charset: utf-8, iso-8859-1;q=0.5 MDN ↗ 响应/请求体的媒体类型,可附 charset 和 boundary(multipart)。POST 表单常见 application/json 或 application/x-www-form-urlencoded。
Content-Type: application/json; charset=utf-8 MDN ↗ 响应体实际应用的压缩格式。客户端必须按反向解码。
Content-Encoding: br MDN ↗ 响应内容的目标语言,BCP 47 标签(zh-Hans / en-US)。
Content-Language: zh-CN MDN ↗ 请求资源的某个字节区间(含起止)。视频拖动、断点续传基础。多个区间逗号分隔。
Range: bytes=0-1023 MDN ↗ 服务器声明支持的范围单位。bytes 表示支持字节级;none 表示不支持。
Accept-Ranges: bytes MDN ↗ 配合 206 Partial Content。格式 bytes 起-止/总长度。
Content-Range: bytes 0-1023/146515 MDN ↗ 配合 Range:值匹配资源 ETag/Last-Modified 时返回 206,不匹配则整资源 200 重发。
If-Range: W/"68b329da9893" MDN ↗ 常用于 PUT/DELETE 防并发覆盖:仅当资源当前 ETag 匹配才执行,否则 412 Precondition Failed。
If-Match: "686897696a7c876b7e" MDN ↗ 与 ETag 配对的缓存验证:值匹配时服务器返回 304 Not Modified,节省带宽。
If-None-Match: W/"68b329da9893" MDN ↗ 与 Last-Modified 配对。若资源自指定时间未修改,返回 304。
If-Modified-Since: Tue, 04 May 2026 08:30:00 GMT MDN ↗ 常用于 PUT:资源自指定时间没改过才执行(防丢失更新)。否则 412。
If-Unmodified-Since: Tue, 04 May 2026 08:30:00 GMT MDN ↗ 常见 scheme:Basic(base64 用户:密码)、Bearer(OAuth/JWT 令牌)、Digest。
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... MDN ↗ 配 401 Unauthorized 返回,告诉客户端使用什么认证 scheme 和 realm。
WWW-Authenticate: Bearer realm="api", error="invalid_token" MDN ↗ 向 HTTP 代理服务器发送的凭证,格式同 Authorization。
Proxy-Authorization: Basic dXNlcjpwYXNz MDN ↗ 407 响应附带,提示客户端如何向代理认证。
Proxy-Authenticate: Basic realm="proxy" MDN ↗ 消息体的精确字节数(不是字符数)。Transfer-Encoding: chunked 时不应同时出现。
Content-Length: 12345 MDN ↗ attachment 触发下载并指定默认文件名(filename* 用 RFC 5987 编码支持中文);inline 内联显示。
Content-Disposition: attachment; filename="report.pdf"; filename*=UTF-8''%E6%8A%A5%E5%91%8A.pdf MDN ↗ 声明返回内容的实际位置,便于客户端为该 URL 缓存(不同于触发跳转的 Location)。
Content-Location: /article/12345.html MDN ↗ chunked 是流式分块传输(响应未知长度时常用)。HTTP/2/3 已废弃。
Transfer-Encoding: chunked MDN ↗ 客户端请求升级到指定协议(websocket / h2c)。需配合 Connection: Upgrade。
Upgrade: websocket MDN ↗ keep-alive / close / Upgrade。HTTP/1.1 默认 keep-alive。HTTP/2/3 已废弃此头。
Connection: Upgrade MDN ↗ 浏览器自动生成的 16 字节 base64 nonce,服务端配合返回 Sec-WebSocket-Accept。
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== MDN ↗ 由 Sec-WebSocket-Key 拼接 GUID 后 SHA-1 + base64 计算得到,确认握手完成。
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= MDN ↗ 客户端候选 / 服务端实际选定的应用层子协议(如 graphql-transport-ws)。
Sec-WebSocket-Protocol: graphql-transport-ws MDN ↗ 当前固定为 13(RFC 6455)。
Sec-WebSocket-Version: 13 MDN ↗ HTTP/1.1 必填。同 IP 多虚拟主机靠它路由。HTTP/2 用 :authority 伪头取代。
Host: example.com:443 MDN ↗ 浏览器/客户端身份字符串。各家浏览器为兼容历史塞了一长串假信息,解析建议用专门库。
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 ↗ 当前请求是从哪个页面发起的。受 Referrer-Policy 控制可被裁剪或省略。注意官方拼写少了一个 r。
Referer: https://example.com/article/123 MDN ↗ 后端服务器软件名/版本。**安全建议隐藏或改为通用值**,避免暴露版本信息便于攻击。
Server: nginx/1.27.0 MDN ↗ 服务器生成响应的 GMT 时间,必填头。HTTP/1.1 强制要求。
Date: Sun, 04 May 2026 12:00:00 GMT MDN ↗ 配 3xx 重定向使用,告诉客户端跳到哪个 URL;也用于 201 Created 返回新资源位置。
Location: https://example.com/new-path MDN ↗ 声明与其他资源的关系(preload / prefetch / canonical / next / prev)。HTTP/2 Push 也基于此(已废)。
Link: </style.css>; rel=preload; as=style MDN ↗ 配 405 Method Not Allowed 返回,列出该资源实际支持的方法。
Allow: GET, HEAD, POST, OPTIONS MDN ↗ 配 429 / 503 / 3xx 使用。值可为秒数(120)或绝对 GMT 时间。
Retry-After: 120 MDN ↗ 反向代理/负载均衡器追加,左侧最早的为原始客户端 IP,每跳追加。**易伪造,不可仅凭它做安全决策。**
X-Forwarded-For: 203.0.113.5, 198.51.100.1 MDN ↗ 反代后端识别原始请求是 http 还是 https。Nginx 常用 $scheme 注入。
X-Forwarded-Proto: https MDN ↗ 反代后端拿到客户端原本访问的 Host(Host 此时已被改写为后端地址)。
X-Forwarded-Host: example.com MDN ↗ 替代 X-Forwarded-* 系列的标准化头(RFC 7239),单条字段写完所有信息。
Forwarded: for=203.0.113.5;proto=https;host=example.com MDN ↗ Nginx 常用:proxy_set_header X-Real-IP $remote_addr。比 XFF 简单(单 IP 不追加),但同样易伪造。
X-Real-IP: 203.0.113.5 入口生成、贯穿整个调用链的 trace ID,便于日志关联。无 RFC 但事实标准。
X-Request-Id: 7c1a3e4d-9b2f-4e8a-bf12-1234567890ab Express / PHP / ASP.NET 等默认输出。**建议关闭**,避免泄露版本和组件信息。
X-Powered-By: Express 历史上让网站知道用户希望不被跟踪。各国/各厂商支持极差,多数主流浏览器已下线该字段。
DNT: 1 Fetch Metadata 系列:浏览器声明本请求是同源 / 同站 / 跨源 / 由用户输入触发。可用于服务端 CSRF 防御。
Sec-Fetch-Site: same-origin MDN ↗ cors / no-cors / navigate / websocket / same-origin。配合 Sec-Fetch-* 让服务端识别请求场景。
Sec-Fetch-Mode: cors MDN ↗ 请求最终用于哪种资源(document / script / image / style / font 等)。
Sec-Fetch-Dest: document MDN ↗ ?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) |
姊妹工具:HTTP 状态码 / MIME 速查 覆盖状态码与媒体类型,本工具补 header 部分,配合使用可在排错时一站搞定。
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)就别新造。
不敏感(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 时跟着惯例(每个单词首字母大写)保持可读性即可。
绝大多数继续用,但有几个「连接层」头被替代或废弃:(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 与其他 header 不同的特殊处理:HTTP 规范要求多值 header 用逗号合并,但 Cookie 的 Expires 字段恰好包含逗号(Tue, 04 May 2026),合并会破坏语义。所以服务端永远写多个 Set-Cookie 行,客户端把它们独立解析。Node.js 拿 res.getHeaders()["set-cookie"] 是数组,不是字符串。
Cache-Control 优先级最高(RFC 9111)。如果响应里同时有 Cache-Control: max-age=3600 和 Expires: Wed, 21 Oct 2026 07:28:00 GMT,所有现代 HTTP 缓存(浏览器、CDN、Squid)都看 Cache-Control 忽略 Expires。Expires 的存在意义:兼容 HTTP/1.0 老代理。新代码可以只写 Cache-Control,不必再写 Expires——除非你明确知道下游会经过 HTTP/1.0 代理(极少见)。
新项目用 Forwarded(RFC 7239)——单条字段塞下原始 IP / 协议 / Host 三件套,少一次配置漏洞机会。事实情况是 X-Forwarded-* 系列仍是绝对主流:(1) 几乎所有反向代理默认输出 X-Forwarded-For/Proto/Host;(2) 框架/库(Spring、Express、Django)开箱识别 XFF;(3) 多层代理时 XFF 会自然追加成列表。安全提醒:XFF 可被客户端伪造,只信任最右侧未被你的代理重写的那段——具体哪一段取决于你部署了几层可信代理。
七成是少配套字段。完整 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 或拼写错。
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。