返回首页

说说HTTP常见的请求头有哪些?作用

问题解析

HTTP头部是HTTP协议的重要组成部分,面试官通过这个问题考察候选人对HTTP协议的熟悉程度,以及能否正确理解和使用各种头部字段。

核心概念

HTTP头部概述

HTTP头部(Header)是HTTP请求和响应中传递附加信息的字段,以键值对形式存在。

头部分类:

  • 通用头部(General Headers):请求和响应都可使用
  • 请求头部(Request Headers):仅用于请求
  • 响应头部(Response Headers):仅用于响应
  • 实体头部(Entity Headers):描述消息体内容

头部格式:

Header-Name: Header-Value

详细解答

常见请求头部

1. Host

Host: www.example.com
Host: api.example.com:8080

作用:

  • 指定请求的目标服务器域名和端口
  • 支持虚拟主机(同一IP多个域名)
  • HTTP/1.1必需头部

重要性:

没有Host头,服务器无法确定请求哪个虚拟主机
Nginx/Apache等Web服务器依赖Host进行路由

2. User-Agent

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

作用:

  • 标识客户端软件信息
  • 包含浏览器类型、版本、操作系统
  • 服务器可根据UA返回适配内容

使用场景:

# 根据User-Agent判断设备类型
def get_device_type(user_agent):
    if 'Mobile' in user_agent or 'Android' in user_agent:
        return 'mobile'
    elif 'iPad' in user_agent:
        return 'tablet'
    else:
        return 'desktop'

3. Accept

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

作用:

  • 告诉服务器客户端可处理的媒体类型(MIME类型)
  • 支持质量因子(q值)表示优先级

常见MIME类型:

text/html          HTML文档
text/plain         纯文本
text/css           CSS样式表
application/json   JSON数据
application/xml    XML数据
application/javascript  JavaScript
image/jpeg         JPEG图片
image/png          PNG图片
image/webp         WebP图片
audio/mpeg         MP3音频
video/mp4          MP4视频
multipart/form-data 表单文件上传

q值优先级:

q值范围0-1,默认1.0,值越大优先级越高

Accept: text/html;q=0.9, application/json;q=1.0
表示优先返回JSON,其次HTML

4. Accept-Language

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

作用:

  • 告诉服务器客户端偏好的语言
  • 支持国际化(i18n)内容返回

使用场景:

# 根据Accept-Language返回对应语言内容
def get_locale(request):
    lang = request.headers.get('Accept-Language', 'en')
    if 'zh' in lang:
        return 'zh_CN'
    elif 'ja' in lang:
        return 'ja_JP'
    else:
        return 'en_US'

5. Accept-Encoding

Accept-Encoding: gzip, deflate, br

作用:

  • 告诉服务器客户端支持的压缩算法
  • 减少传输数据量,提高传输效率

常见压缩算法:

gzip     最常用,压缩率适中,速度快
deflate  使用zlib压缩
br       Brotli算法,压缩率最高,适合静态资源
identity 不压缩

压缩效果:

原始HTML100KB
gzip压缩后:15KB(节省85%)
brotli压缩后:12KB(节省88%

6. Accept-Charset

Accept-Charset: utf-8, iso-8859-1;q=0.5

作用:

  • 告诉服务器客户端支持的字符编码
  • 现代Web中较少使用(通常默认UTF-8)

7. Content-Type

Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
Content-Type: text/html; charset=utf-8

作用:

  • 告诉服务器请求体的媒体类型
  • POST/PUT请求必需头部

常见类型详解:

application/x-www-form-urlencoded:

POST /api/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=admin&password=123456

application/json:

POST /api/users HTTP/1.1
Content-Type: application/json

{
  "username": "admin",
  "email": "admin@example.com"
}

multipart/form-data:

POST /api/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"

admin
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="photo.jpg"
Content-Type: image/jpeg

[二进制文件数据]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

8. Content-Length

Content-Length: 348

作用:

  • 表示请求体的字节长度
  • 服务器据此读取完整请求体

与Transfer-Encoding的关系:

# 二选一,不能同时使用
Content-Length: 348
# 或
Transfer-Encoding: chunked

9. Referer

Referer: https://www.google.com/search?q=example

作用:

  • 告诉服务器请求从哪个页面跳转而来
  • 用于统计分析、防盗链

使用场景:

# 防盗链检查
def check_referer(request):
    referer = request.headers.get('Referer', '')
    if not referer.startswith('https://mydomain.com'):
        return error("非法请求来源")

注意:

Referer可能被浏览器禁用或篡改
不应作为安全验证的唯一依据

10. Connection

Connection: keep-alive
Connection: close

作用:

  • 控制TCP连接行为
  • HTTP/1.1默认keep-alive

取值:

keep-alive  保持连接,复用TCP连接(默认)
close       请求完成后关闭连接

11. Cookie

Cookie: session_id=abc123; user_pref=dark_mode; last_visit=2024-01-01

作用:

  • 携带服务器之前设置的Cookie
  • 用于会话管理、个性化设置

Cookie属性:

# 服务器设置Cookie
Set-Cookie: session_id=abc123; Path=/; Domain=.example.com; HttpOnly; Secure; SameSite=Strict; Max-Age=3600

属性说明:
- Path:Cookie生效路径
- Domain:Cookie生效域名
- Expires/Max-Age:过期时间
- HttpOnly:禁止JavaScript访问
- Secure:仅HTTPS传输
- SameSite:跨站请求控制(Strict/Lax/None)

12. Authorization

Authorization: Basic YWRtaW46MTIzNDU2
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Authorization: Digest username="admin", realm="example", nonce="abc123", response="xyz789"

作用:

  • 携带身份验证信息

认证方式:

Basic    Base64编码的用户名:密码(不安全,需配合HTTPS)
Bearer   令牌认证(JWT、OAuth2)
Digest   摘要认证(挑战-响应机制)

13. Cache-Control

Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: max-age=3600

作用:

  • 控制缓存行为
  • 请求和响应都可使用

请求指令:

no-cache      强制向服务器验证
no-store      不缓存任何内容
max-age=0     等同于no-cache
max-stale=60  接受过期60秒内的缓存
min-fresh=60  要求缓存至少在60秒内不过期
only-if-cached 只使用缓存,不请求服务器

缓存相关头部

协商缓存

If-Modified-Since / Last-Modified:

# 第一次请求
GET /style.css HTTP/1.1

# 响应
HTTP/1.1 200 OK
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
Cache-Control: max-age=0

# 后续请求
GET /style.css HTTP/1.1
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT

# 未修改响应
HTTP/1.1 304 Not Modified

If-None-Match / ETag:

# 第一次请求
GET /style.css HTTP/1.1

# 响应
HTTP/1.1 200 OK
ETag: "33a64df5"
Cache-Control: max-age=0

# 后续请求
GET /style.css HTTP/1.1
If-None-Match: "33a64df5"

# 未修改响应
HTTP/1.1 304 Not Modified

ETag vs Last-Modified:

ETag优势:
- 更精确(基于内容哈希)
- 不受时间精度限制
- 可区分相同时间戳的不同内容

Last-Modified优势:
- 更简单
- 人类可读

强制缓存

# 响应头部
Cache-Control: max-age=3600        # 缓存1小时
Cache-Control: max-age=31536000    # 缓存1年(静态资源常用)
Expires: Wed, 21 Oct 2024 07:28:00 GMT  # 绝对过期时间(已废弃)

缓存优先级:

1. Cache-Control: max-age(HTTP/1.1)
2. Expires(HTTP/1.0)
3. 启发式缓存(根据Last-Modified估算)

安全相关头部

请求安全头部

# 来源信息
Origin: https://example.com

# 跨站请求伪造防护
X-CSRF-Token: abc123

# 内容安全策略报告
Content-Security-Policy-Report-Only: default-src 'self'

响应安全头部

# 内容安全策略
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'

# XSS防护
X-XSS-Protection: 1; mode=block

# 点击劫持防护
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN

# MIME类型嗅探防护
X-Content-Type-Options: nosniff

# HSTS(强制HTTPS)
Strict-Transport-Security: max-age=31536000; includeSubDomains

# 引用策略
Referrer-Policy: strict-origin-when-cross-origin

深入理解

头部大小限制

浏览器限制:
- 单个头部值:通常8KB-16KB
- 总头部大小:通常32KB-64KB

服务器限制:
- Nginx:large_client_header_buffers(默认8KB)
- Apache:LimitRequestFieldSize(默认8KB)
- Tomcat:maxHttpHeaderSize(默认8KB)

超出限制返回:431 Request Header Fields Too Large

自定义头部

# X-开头的自定义头部(传统)
X-Request-ID: abc123
X-API-Version: v2

# 非X-开头的自定义头部(现代推荐)
Request-ID: abc123
API-Version: v2

使用场景:

# 请求追踪
@app.before_request
def add_request_id():
    request_id = request.headers.get('X-Request-ID', str(uuid.uuid4()))
    g.request_id = request_id

# API版本控制
@app.route('/api/data')
def get_data():
    version = request.headers.get('API-Version', 'v1')
    if version == 'v2':
        return get_data_v2()
    return get_data_v1()

HTTP/2头部压缩

HTTP/2使用HPACK算法压缩头部:

1. 静态表:预定义常见头部字段
2. 动态表:连接级别的自定义表
3. 霍夫曼编码:压缩字符串

效果:
- 减少头部大小50%-90%
- 减少重复头部传输

最佳实践

缓存策略配置

# Nginx缓存配置
server {
    # 静态资源 - 长期缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        add_header Vary "Accept-Encoding";
    }

    # HTML - 不缓存
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-store";
    }

    # API - 协商缓存
    location /api/ {
        expires 1h;
        add_header Cache-Control "public, must-revalidate";
        add_header ETag "$request_filename$request_body";
    }
}

安全头部配置

# Nginx安全头部
server {
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self'" always;

    # HSTS(仅HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

CORS配置

# 请求
OPTIONS /api/data HTTP/1.1
Origin: https://frontend.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type, Authorization

# 响应
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://frontend.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
# Flask CORS配置
from flask_cors import CORS

CORS(app,
     origins=['https://frontend.example.com'],
     methods=['GET', 'POST', 'PUT', 'DELETE'],
     allow_headers=['Content-Type', 'Authorization'],
     supports_credentials=True,
     max_age=86400)

面试要点

  1. 常见请求头:Host、User-Agent、Accept、Content-Type、Cookie、Authorization
  2. 缓存头部:Cache-Control、ETag/If-None-Match、Last-Modified/If-Modified-Since
  3. 安全头部:CSP、HSTS、X-Frame-Options、X-Content-Type-Options
  4. Cookie属性:HttpOnly、Secure、SameSite、Domain、Path
  5. Content-Type类型:application/json、form-urlencoded、multipart/form-data

常见面试追问:

  • Cookie的HttpOnly和Secure属性有什么用?
  • ETag和Last-Modified有什么区别?
  • 什么是CORS?如何解决跨域问题?
  • Cache-Control有哪些常用指令?
  • 什么是HSTS?有什么作用?