HTTP 请求头 Headers 完整详解

一、基础概念

HTTP 请求头(Request Headers)是客户端(浏览器、Postman、程序)发给服务器时,附带在请求体前的键值对,用来告诉服务器:客户端环境、身份、资源需求、权限、缓存、跨域、跳转来源等信息。 格式:Key: Value,每行一个,请求头与请求体空行分隔。

分类:

  1. 标准通用头:请求、响应都能用(Cache-Control、Referrer-Policy)
  2. 请求专属头:仅客户端发给服务端(User-Agent、Cookie、Referer)
  3. 实体头:描述请求体数据(Content-Type、Content-Length)
  4. CORS跨域专用头:跨域校验(Origin、Access-Control-Request-Method)

二、高频必懂请求头(生产最常用)

1. 身份与客户端标识类

User-Agent

作用:告诉服务器客户端是什么设备、浏览器、系统、爬虫。 示例:

css 复制代码
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36

用途:

  • 后台区分PC/手机/爬虫,返回适配页面
  • 反爬:拦截空UA、异常爬虫UA

作用:客户端存储的会话、登录、个性化数据,每次请求自动携带。 示例:

ini 复制代码
Cookie: sid=abc123; userid=10086; theme=dark

配套:服务端用 Set-Cookie 写入客户端;IIS/Nginx/.NET全平台依赖Cookie做登录会话。

Authorization

接口鉴权核心头,传递登录凭证,无Cookie场景使用(前后端分离、API接口) 两种主流格式:

  1. Bearer Token(JWT 最常用)
makefile 复制代码
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  1. Basic 基础认证(账号密码Base64加密)
makefile 复制代码
Authorization: Basic YWRtaW46MTIzNDU2

2. 资源协商、内容类型类

Accept

告诉服务器:客户端能接收什么格式的响应数据,优先级逗号分隔。 示例:

bash 复制代码
Accept: text/html,application/json;q=0.9,*/*;q=0.8

含义:优先返回HTML,其次JSON,其他格式兜底。

Accept-Encoding

客户端支持的压缩算法,服务器会按此压缩返回内容(大幅减少带宽)

makefile 复制代码
Accept-Encoding: gzip, deflate, br

配套:响应头 Content-Encoding: gzip Nginx/IIS 都可开启gzip压缩,依赖这个请求头判断。

Accept-Language

客户端系统语言,服务器返回对应多语言页面

css 复制代码
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Content-Type

有请求体时必须携带(POST/PUT/上传),描述请求体数据格式 常用值:

  1. application/json 前后端分离接口JSON传参(90%接口使用)
  2. application/x-www-form-urlencoded 普通表单提交
  3. multipart/form-data 文件上传、带文件表单
  4. text/plain 纯文本

Content-Length

请求体字节长度,自动由浏览器/框架生成,服务端判断数据完整性。

3. 缓存控制类(优化重复请求性能)

If-Modified-Since

客户端带上上次资源修改时间,服务器对比:

  • 资源未更新:返回 304 Not Modified,不返回数据,走本地缓存
  • 资源更新:返回200+新内容

If-None-Match

携带ETag标识(资源唯一指纹),比时间判断更精准,优先使用。

Cache-Control

客户端强制缓存策略

yaml 复制代码
Cache-Control: no-cache  # 每次必须校验服务器是否更新
Cache-Control: max-age=3600 # 1小时内不请求服务器,直接读本地缓存

4. 跳转、来源、隐私类(上文Referrer-Policy配套)

Referer

记录当前请求从哪个页面跳转而来(防盗链、访问统计)

bash 复制代码
Referer: shturl.cc/vZJZsNT6jtNqBw

配合 Referrer-Policy 控制是否发送、发送完整路径/仅域名。

Referrer-Policy

客户端侧策略,和服务端响应头作用一致,单独控制当前请求Referer粒度。

5. 跨域 CORS 请求专用头(前后端分离核心)

Origin

跨域请求必带,告诉服务器请求来源域名;同域请求浏览器不会自动携带。 示例:Origin: shturl.cc/YDVakW5aY8g 服务器校验Origin,允许则返回 Access-Control-Allow-Origin

Access-Control-Request-Method

预检OPTIONS请求专用,告诉服务器实际要用的请求方法(POST/PUT/DELETE)

Access-Control-Request-Headers

预检请求,告知服务器自定义请求头(如Token)

6. 连接、代理、真实IP类(服务器运维必备)

Host

必填头!指定访问的域名,一台服务器绑定多站点靠Host区分网站(IIS/Nginx站点绑定核心)

makefile 复制代码
Host: www.baidu.com

X-Forwarded-For(XFF)

反向代理场景(Nginx前置、CDN)传递用户真实IP 架构:用户 → CDN/Nginx → IIS/.NET服务 IIS后端读取XFF才能拿到真实访客IP,否则只能获取代理IP。 格式:X-Forwarded-For: 110.xx.xx.xx

X-Real-IP

Nginx单独配置传递真实客户端IP,简化XFF读取。

Connection

控制TCP连接复用

yaml 复制代码
Connection: keep-alive # 保持连接,多次请求复用TCP,性能更好
Connection: close      # 请求完成立即断开连接

7. 安全、防攻击请求头

X-Requested-With

区分AJAX异步请求还是页面直接访问 常见值:XMLHttpRequest 后端可通过该头判断是否为接口异步调用。

Sec-Fetch-* 系列(现代浏览器自动添加)

浏览器安全防护,区分请求类型,防御CSRF、恶意跳转

  • Sec-Fetch-Mode: cors 跨域接口
  • Sec-Fetch-Site: same-site 同站点 / cross-site 跨站

DNT: 1

Do Not Track,告诉网站不要追踪用户行为(大部分网站不生效)


三、IIS / Nginx 场景实操区别

1. 读取自定义请求头

  • Nginx:$http_xxx 读取,如 $http_authorization
  • IIS (.NET):Request.Headers["Authorization"] 获取所有头

2. 自定义全局请求头拦截/添加

  • Nginx:proxy_set_header 转发上游、if 判断拦截非法Header
  • IIS:web.config + URL重写模块 过滤、新增请求头

3. 反向代理IP头处理

Nginx必须手动配置 proxy_set_header X-Forwarded-For $remote_addr; IIS需安装URL重写模块,解析XFF获取真实客户端IP。


四、请求头常见问题

  1. 跨域报错:自定义Token头、POST请求触发OPTIONS预检,服务器未配置允许头/域名
  2. 后端拿不到真实IP:前端有Nginx/CDN,未传递X-Forwarded-For
  3. 接口接收不到JSON参数 :忘记加 Content-Type: application/json
  4. 防盗链失效:Referrer-Policy设置为no-referrer,请求不带Referer
  5. 缓存不生效:缺少If-None-Match、Cache-Control配置错误

五、极简速查表

请求头 核心用途
Host 区分服务器多站点,必填
User-Agent 识别浏览器/设备/爬虫
Cookie 会话、登录状态存储
Authorization API接口鉴权Token
Content-Type POST请求数据格式
Accept 服务器返回什么格式数据
Referer 来源页面,防盗链统计
Origin 跨域请求来源域名
X-Forwarded-For 代理场景真实用户IP
Accept-Encoding 开启gzip压缩
If-None-Match 资源缓存304优化
相关推荐
李伟_Li慢慢1 小时前
03-threejs架构原理浅析
前端·three.js
cidy_981 小时前
Codex、Hermes、Claude 使用共享知识库的对比
前端
牧艺1 小时前
浏览器 3D 交互实战:射线拾取、描边高亮与业务面板联动
前端·three.js·数据可视化
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十五):控制台静态页面、深入研究时间格式化方案
后端·go·ai编程
程序猿大帅1 小时前
Java 虚拟线程发布两年后,我们把它从生产环境移除了
后端
叉歪1 小时前
为 UnoCSS 扩展无限色阶与主题换色
前端·css
jiayong231 小时前
第 44 课:任务详情抽屉里的评论输入与操作记录联动
前端
ndsc_d1 小时前
前端实战复盘:用AI直接生成响应式官网落地页与React源码
前端·人工智能·react.js·ui·前端框架·aigc·paico
大家的林语冰2 小时前
✌️ Deno 2.9 来了,ESM 直接导入 CSS,甚至能开发桌面应用?!
前端·javascript·node.js