说说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 不压缩
压缩效果:
原始HTML:100KB
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)
面试要点
- 常见请求头:Host、User-Agent、Accept、Content-Type、Cookie、Authorization
- 缓存头部:Cache-Control、ETag/If-None-Match、Last-Modified/If-Modified-Since
- 安全头部:CSP、HSTS、X-Frame-Options、X-Content-Type-Options
- Cookie属性:HttpOnly、Secure、SameSite、Domain、Path
- Content-Type类型:application/json、form-urlencoded、multipart/form-data
常见面试追问:
- Cookie的HttpOnly和Secure属性有什么用?
- ETag和Last-Modified有什么区别?
- 什么是CORS?如何解决跨域问题?
- Cache-Control有哪些常用指令?
- 什么是HSTS?有什么作用?