基础知识《HTTP字段与状态码详细说明》
HTTP 协议字段与状态码完整指南
一、HTTP 字段(请求头与响应头)
HTTP 头字段用于传递客户端和服务器之间的元数据,分为 请求头(Request Headers) 和 响应头(Response Headers)。
1. 常见请求头字段
字段名 | 说明 | 示例值 |
---|---|---|
Host | 目标服务器的主机名和端口号(必填字段)。 | Host: example.com:8080 |
User-Agent | 客户端标识(浏览器、操作系统或应用程序信息)。 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) |
Accept | 客户端支持的响应内容类型(MIME 类型)。 | Accept: application/json, text/html |
Accept-Encoding | 支持的压缩编码。 | Accept-Encoding: gzip, deflate |
Content-Type | 请求体的媒体类型。 | Content-Type: application/json |
Authorization | 身份凭证(如 JWT Token)。 | Authorization: Bearer eyJhbGciOiJ... |
Cookie | 客户端发送的 Cookie 信息。 | Cookie: session_id=abc123; user=admin |
Cache-Control | 缓存策略。 | Cache-Control: no-cache (禁用缓存) |
Referer | 当前请求的来源页面 URL。 | Referer: https://google.com |
Accept-Charset | 声明客户端支持的字符集及其优先级(如 UTF-8、ISO-8859)。现代浏览器通常默认支持 UTF-8,此字段已较少显式使用。 | Accept-Charset: utf-8, iso-8859-1; q=0.5 (q 值表示权重) |
Accept-Language | 指定客户端期望的自然语言(如中文、英文)。服务端根据优先级返回多语言内容。 | Accept-Language: zh-CN, en-US; q=0.8 |
Cookie | 客户端向服务器发送已存储的 Cookie 数据。 | Cookie: session_id=abc123; user=admin |
If-Modified-Since | 资源在指定时间后未修改则返回 304 状态码,使用本地缓存。关联字段:Last-Modified (响应头)。 | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
If-None-Match | 携带资源的 ETag 值,若未变化则返回 304。比时间戳更精确,避免时间同步问题。 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
X-Forwarded-For | 标识客户端的原始 IP(常用于代理链中记录真实来源)。非标准字段,需代理服务器显式添加。 | X-Forwarded-For: 192.168.1.1, 10.0.0.1 (第一个 IP 为客户端) |
Priority | 提示服务器请求的优先级(如资源加载顺序)。优化页面加载性能,需浏览器和服务端共同支持(当前支持度有限)。在 HTTP/2 和 HTTP/3 中,优先级机制通过专门的 PRIORITY_UPDATE 帧实现,而非头字段。 | Priority: u=1, i (表示高优先级) |
2. 常见响应头字段
字段名 | 说明 | 示例值 |
---|---|---|
Content-Type | 响应体的媒体类型及编码。 | Content-Type: text/html; charset=UTF-8 |
Content-Encoding | 响应体的压缩方式。 | Content-Encoding: gzip |
Server | 服务器软件信息。 | Server: Apache/2.4.1 |
Set-Cookie | 服务器设置的 Cookie。 | Set-Cookie: session_id=def456; Path=/; HttpOnly |
Location | 重定向目标 URL(用于 3xx 状态码)。 | Location: https://new-example.com |
Cache-Control | 资源缓存策略。 | Cache-Control: public, max-age=3600 (缓存 1 小时) |
Access-Control-Allow-Origin | 允许跨域请求的源。 | Access-Control-Allow-Origin: * (允许所有域名) |
ETag | 资源的唯一标识符(用于缓存验证)。 | ETag: "12345abcde" |
WWW-Authenticate | 定义身份验证方式(如 Basic、Bearer Token)。配合 401 状态码要求客户端提供凭证。 | WWW-Authenticate: Basic realm="Access to site" |
Last-Modified | 资源最后修改时间,用于缓存验证。关联请求头:If-Modified-Since 。 | Last-Modified: Tue, 15 Nov 1994 08:12:31 GMT |
Expires | 指定资源过期时间(HTTP/1.0 缓存机制)。已被 Cache-Control 的 max-age 取代,优先级更低。 | Expires: Thu, 01 Dec 2025 16:00:00 GMT |
3. 通用字段
字段名 | 说明 | 示例值 |
---|---|---|
Connection | 控制连接是否在当前事务完成后关闭。优化性能时启用长连接,减少重复握手开销。 | Connection: keep-alive (HTTP/1.1 默认,保持长连接)Connection: close (HTTP/1.0 默认,关闭连接) |
Content-Length | 表示请求或响应体的字节长度。若使用分块传输(Transfer-Encoding: chunked ),则无需此字段。 | Content-Length: 348 |
Date | 报文创建时间,格式为格林威治时间(GMT)。用于缓存验证和日志记录。 | Date: Tue, 15 Nov 1994 08:12:31 GMT |
4. 请求头与响应头完整示例
请求示例
GET /api/user?id=123 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Cache-Control: no-cache
Cookie: session_id=abc123
响应示例
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
Cache-Control: max-age=3600
Set-Cookie: session_id=def456; Path=/; HttpOnly
ETag: "12345abcde"
Content-Length: 128
{"id": 123, "name": "John Doe"}
二、HTTP 状态码详解
HTTP 状态码由三位数字组成,分为五类:
1. 1xx(信息响应)
- 100 Continue
客户端应继续发送请求体(用于大文件上传前的确认)。 - 101 Switching Protocols
服务器同意切换协议(如从 HTTP 切换到 WebSocket)。
2. 2xx(成功)
- 200 OK
请求成功,返回预期结果。
HTTP/1.1 200 OK
Content-Type: text/html
<html>...</html>
- 201 Created
资源已创建(常用于 POST 请求)。
HTTP/1.1 201 Created
Location: /api/users/789
{"id": 789, "message": "User created"}
- 204 No Content
请求成功,但无返回内容(如 DELETE 请求)。
3. 3xx(重定向)
- 301 Moved Permanently
资源永久迁移到新 URL(SEO 友好)。
HTTP/1.1 301 Moved Permanently
Location: https://new-example.com
- 302 Found
资源临时重定向(浏览器下次仍请求原 URL)。
HTTP/1.1 302 Found
Location: /temp-page
- 304 Not Modified
资源未修改,客户端使用本地缓存。
HTTP/1.1 304 Not Modified
ETag: "12345abcde"
4. 4xx(客户端错误)
- 400 Bad Request
请求格式错误(如缺少必填字段)。
HTTP/1.1 400 Bad Request
{"error": "Missing 'email' field"}
- 401 Unauthorized
需要身份验证(未提供有效凭证)。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example.com"
- 403 Forbidden
服务器拒绝访问(权限不足)。
HTTP/1.1 403 Forbidden
{"error": "Access denied"}
- 404 Not Found
请求的资源不存在。
HTTP/1.1 404 Not Found
<h1>404 Page Not Found</h1>
5. 5xx(服务器错误)
- 500 Internal Server Error
服务器内部错误(通用错误码)。
HTTP/1.1 500 Internal Server Error
{"error": "Database connection failed"}
- 502 Bad Gateway
代理服务器从上游服务器收到无效响应。
HTTP/1.1 502 Bad Gateway
- 503 Service Unavailable
服务器暂时不可用(维护或过载)。
HTTP/1.1 503 Service Unavailable
Retry-After: 3600
三、关键总结与最佳实践
-
HTTP 字段
- 使用
Cache-Control
和ETag
优化缓存性能。 - 跨域请求时配置
Access-Control-Allow-Origin
。 - 敏感信息通过
Authorization
头传递,而非 URL 参数。
- 使用
-
状态码使用原则
- 精准匹配场景:避免滥用
200
或500
。- 资源不存在 →
404
- 身份未认证 →
401
- 权限不足 →
403
- 资源不存在 →
- 重定向区分:
- 永久迁移 →
301
- 临时跳转 →
302
- 永久迁移 →
- 客户端错误:提供清晰的错误描述(如
400
时指明缺失字段)。
- 精准匹配场景:避免滥用
-
安全建议
- Cookie 设置
HttpOnly
和Secure
属性。 - 使用 HTTPS 加密传输敏感数据。
- Cookie 设置
四、特殊状态码(彩蛋)
- 418 I’m a Teapot
HTTP/1.1 418 I'm a Teapot
Content-Type: text/plain
I'm a teapot. Can't brew coffee.
源自 RFC 2324,用于幽默或测试场景。
附录:完整 HTTP 状态码列表可参考 MDN Web Docs。