HTTP 请求头与响应头速查
缓存怎么设、跨域怎么放行、哪些安全头必须加、Cookie 该带什么属性——最常用的头部字段按用途分成四组对照。
HTTP 头部字段是请求和响应里附带的一小段元信息,决定了浏览器要不要缓存、跨域能不能过、页面能不能被内嵌、Cookie 会不会被脚本读到。它们不像状态码那样一眼能看出结果,配错了往往表现为「时好时坏」或「本地正常线上不对」。
这篇按用途把最常用的字段分成四组:缓存控制、跨域、安全、内容协商与身份。每一组都给出推荐取值,最后列出四个最容易配错的地方——尤其是 no-cache 和 no-store 的区别,以及 CORS 里通配符与凭证不能共存这两条。
1缓存控制:强缓存与协商缓存
浏览器缓存由两类机制组成:强缓存(在有效期内直接用本地副本,不发请求)和协商缓存(每次都问服务器「变了吗」,没变就返回 304 省流量)。Cache-Control 是现在的主力字段,Expires 是它的老前辈。
| 字段 | 取值示例 | 作用 |
|---|---|---|
Cache-Control | max-age=31536000, immutable | 强缓存时长(秒)。静态资源配合文件名哈希可设一年 |
Cache-Control | no-cache | 每次使用前都要回源校验,仍会存副本。入口 HTML 常用 |
Cache-Control | no-store | 完全不缓存,任何副本都不留。含敏感信息的响应必须用它 |
ETag | "a1b2c3" | 内容指纹,配合请求头 If-None-Match 做协商缓存 |
Last-Modified | Sun, 05 Oct 2026 08:00:00 GMT | 文件最后修改时间,配合 If-Modified-Since 做协商缓存 |
Expires | HTTP 日期格式 | 老式强缓存字段,已被 Cache-Control 取代 |
Vary | Accept-Encoding | 告知缓存按哪些请求头区分版本,压缩内容必须带它 |
一句话记法:no-cache 是「用前先问」,no-store 才是「完全不留」。这两个名字起得有误导性,是缓存配错的第一大来源。
2跨域(CORS)相关字段
跨域请求能不能通过,取决于服务端返回的 Access-Control-Allow-* 系列响应头。非简单请求(如带自定义头、发 JSON、用 PUT/DELETE)会先发一次 OPTIONS 预检请求,预检通过了才发真实请求。
| 字段 | 方向 | 说明 |
|---|---|---|
Origin | 请求 | 标记请求来源,由浏览器自动添加,脚本改不了 |
Access-Control-Allow-Origin | 响应 | 允许的来源。带 Cookie 时必须回显具体来源,不能写 * |
Access-Control-Allow-Credentials | 响应 | 是否允许携带凭证(Cookie、Authorization) |
Access-Control-Allow-Methods | 响应 | 预检响应中声明允许的请求方法 |
Access-Control-Allow-Headers | 响应 | 预检响应中声明允许的自定义请求头 |
Access-Control-Max-Age | 响应 | 预检结果缓存多少秒,减少 OPTIONS 请求次数 |
OPTIONS 预检本身必须返回 2xx 并带上正确的 Allow-* 头,否则浏览器直接拦截,业务代码根本没机会执行——这也是「本地测试正常、线上跨域失败」最常见的原因。
3安全相关响应头
这几个字段不解决业务问题,但能挡掉一整类攻击。它们全部由服务端下发,前端改不了。新站点建议至少配置前三项。
| 字段 | 推荐取值 | 防什么 |
|---|---|---|
Strict-Transport-Security | max-age=31536000 | 强制浏览器后续只用 HTTPS 访问(HSTS) |
Content-Security-Policy | default-src 'self' | 限制脚本、样式、图片的加载来源,缓解 XSS |
X-Content-Type-Options | nosniff | 禁止浏览器猜测 MIME 类型,避免把上传文件当脚本执行 |
X-Frame-Options | DENY 或 SAMEORIGIN | 防止页面被其他站点用 iframe 内嵌(点击劫持) |
Referrer-Policy | strict-origin-when-cross-origin | 控制跳转时 Referer 泄露多少信息 |
Permissions-Policy | geolocation=(), camera=() | 按需关闭浏览器特性,减少被滥用的面 |
4内容协商与身份字段
这一组决定「传的是什么、要什么、以什么身份」。其中 Content-Type 与 Accept 的区分、charset 的位置,是接口联调时最常被问到的问题。
| 字段 | 方向 | 说明 |
|---|---|---|
Content-Type | 两者 | 请求/响应体的媒体类型,如 application/json; charset=utf-8 |
Accept | 请求 | 客户端期望的响应格式 |
Accept-Encoding / Content-Encoding | 两者 | 压缩协商,常见取值 gzip、br |
Accept-Language | 请求 | 期望的语言,用于多语言站点 |
Authorization | 请求 | 认证凭证,如 Bearer <token> |
Cookie / Set-Cookie | 请求 / 响应 | 会话状态的读写两端 |
User-Agent | 请求 | 客户端标识,用于兼容与统计 |
Location | 响应 | 配合 3xx 状态码或 201 指出目标地址 |
5Cookie 的六个属性
Cookie 由服务端通过 Set-Cookie 下发,属性决定了它的安全边界和生命周期。其中 HttpOnly、Secure、SameSite 三项直接关系到账户安全,建议默认全开。
- HttpOnly
- 禁止 JavaScript 读取该 Cookie,能有效防止 XSS 攻击窃取会话。存放登录态的 Cookie 必须加
- Secure
- 仅通过 HTTPS 传输,防止在明文链路上被截获
- SameSite
- 控制跨站请求是否携带。Lax 是当前浏览器默认值;Strict 最严;None 必须同时加 Secure
- Domain / Path
- 限定 Cookie 的生效范围。Domain 设得过宽会把 Cookie 暴露给不相关的子域
- Max-Age / Expires
- 有效期。都不设置时为会话 Cookie,关闭浏览器即失效
- 前缀 __Host- / __Secure-
- Cookie 名称前缀,强制浏览器校验 Secure 与 Path 条件,是额外的加固手段
6四个最容易配错的地方
- no-cache ≠ 不缓存
- 它要求每次使用前回源校验,副本仍然会存;真正「完全不存」的是 no-store。把含敏感信息的接口配上 no-cache,本地磁盘上依然留有明文副本,这是常见的认知错误。
- CORS 通配符与凭证不能共存
- 当请求携带 Cookie 时,
Access-Control-Allow-Origin必须回显具体来源,写*会被浏览器直接拒绝。这一条在「一个接口给多个前端用」时最容易踩。 - 预检请求失败不在业务代码里
- OPTIONS 预检由浏览器发起、框架或网关处理。如果预检返回 404 / 405,或没带 Allow-* 头,真实请求根本不会发出——排查时要看 Network 面板里的 OPTIONS 那一条,而不是业务请求。
- HSTS 下发后很难撤销
- 浏览器在 max-age 有效期内会强制用 HTTPS 访问该域名,一旦证书出问题或配置错误,用户连降级到 HTTP 的机会都没有。上线前先用较短的 max-age(如 300 秒)验证,确认无误再逐步加长。
看完就能用的站内工具
全部工具总览 →在线解析 HTTP 响应头,逐项检查 HSTS、CSP、X-Frame-Options 等八项安全头是否齐全,同时提示 Server、X-Powered-By 等信息泄露头与缓存策略配置,并给出安全评分,粘贴响应头即可出结果。
生成 Cache-Control 响应头,支持 public 与 private、max-age、s-maxage、immutable、must-revalidate 等指令,附常用资源类型的缓存天数换算。
生成 CORS 跨域响应头配置,勾选允许的请求方法与来源,输出完整的访问控制头与预检请求响应示例,并提示通配符与凭证的非法组合。
在线生成网站安全响应头配置,包含 HSTS、X-Frame-Options、X-Content-Type-Options、Referrer-Policy 等,输出 Nginx 与 Apache 配置片段
在线生成 Set-Cookie 响应头,配置 SameSite、Secure、HttpOnly、Max-Age 与 __Host- 前缀,并自动校验属性冲突
在线扫描页面源码或链接列表里的 http:// 明文资源,按主动型与被动型分类,给出被拦截风险清单与一键升级结果
关于「HTTP 请求头与响应头速查」的常见问题
Cache-Control 的 no-cache 和 no-store 到底差在哪?
no-cache 表示「每次使用缓存前必须先向服务器校验」,本地仍然会存副本,只是不直接用;no-store 表示「完全不要缓存,任何副本都不要留」。所以含密码、验证码、个人隐私的响应应该用 no-store;而入口 HTML 想保证用户拿到最新版本、又不想每次都完整下载,用 no-cache 更合适。
为什么设置了 CORS 响应头还是报跨域错误?
按顺序检查四点:一是有没有带凭证(带 Cookie 时 Allow-Origin 不能是 *);二是有没有在 Allow-Headers 里列出实际发送的自定义头;三是 OPTIONS 预检是否返回了 2xx 且带 Allow-* 头;四是缓存——旧的预检结果可能被 Max-Age 缓存住,改完配置要清缓存或临时把 Max-Age 设小。排查时以浏览器控制台的原始报错为准,它通常会直接指出是哪一项不匹配。
HSTS 配置错了会导致网站打不开吗?
会。HSTS 生效后,浏览器在 max-age 有效期(最长可到两年)内强制对该域名使用 HTTPS,无法手动降级到 HTTP。如果此时证书过期、配置出错,用户会直接看到证书错误且无法绕过。所以顶配套路是:先设 max-age=300 验证,确认全站 HTTPS 与证书续期都正常,再逐步提高到一个月、一年,并考虑是否加 includeSubDomains(加了会同时覆盖所有子域,风险更高)。
HttpOnly 能从前端用 JavaScript 设置吗?
不能。HttpOnly、Secure、SameSite 这些安全属性只能由服务端通过 Set-Cookie 响应头下发,前端用 document.cookie 写入的 Cookie 无法带上这些属性。这也意味着前端纯 JS 方案(如把 token 存 localStorage)天然不具备 HttpOnly 的保护——这也是把登录态放在 HttpOnly Cookie 里更安全的原因。
继续查:相关内容
全部速查 →内容说明:本页速查数据由本站自行整理,事实性内容以对应官方规范与文档为准,未复制第三方速查表或百科的表述。数据最后核对日期:2026-10-05。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。
速查在线工具箱