Skip to content

HTTP 响应

服务器在接收并解释客户端的请求消息后,会返回一个 HTTP 响应消息。响应消息的结构与请求消息类似:

  • 一个 状态行(Status-Line)
  • 零个或多个 头部字段(Header fields) (通用、响应、表示头),后跟 CRLF
  • 一个 空行(Empty line) (CRLF),表示头部字段的结束
  • 可选的,一个 消息体(Message-body)
状态行(Status-Line)的结构如下:
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

这表明服务器在响应中使用的 HTTP 版本。例如:

HTTP-Version = HTTP/1.1

支持 HTTP/2 或 HTTP/3 的服务器将在帧层(framing layer)以不同方式处理版本控制,但通常会为状态行概念保持 HTTP/1.1 的语义。

状态码(Status-Code)是一个 3 位整数,表示客户端请求的结果。第一位数字定义了响应的类别:

序号类别描述
11xx: 信息类响应请求已被接收,正在继续处理。(例如,100 Continue)
22xx: 成功操作已成功接收、理解并接受。(例如,200 OK, 201 Created)
33xx: 重定向客户端必须采取进一步操作才能完成请求。(例如,301 Moved Permanently, 302 Found)
44xx: 客户端错误请求包含错误语法或服务器无法完成请求。(例如,400 Bad Request, 401 Unauthorized, 404 Not Found)
55xx: 服务器错误服务器未能完成一个显然有效的请求。(例如,500 Internal Server Error, 503 Service Unavailable)

在专门的章节中有完整的状态码列表。HTTP 应用程序无需理解所有已注册的状态码,但应能够处理响应的类别。

原因短语(Reason-Phrase)是对状态码(Status-Code)的简短、易于人类阅读的文本描述。它仅用于提供信息,不会影响协议对响应的解释。示例:OK、Not Found、Internal Server Error。

客户端应依赖于数值状态码(Status-Code),而不是原因短语(Reason-Phrase)来判断结果。

响应头部字段(Response Header Fields)

Section titled “响应头部字段(Response Header Fields)”

响应头部字段允许服务器传递关于响应的额外信息,这些信息无法放在状态行(Status-Line)中。这些头部提供有关服务器、资源或客户端应如何处理响应的详细信息。

常见的响应头部包括:

  • Date: 响应生成时的日期和时间。
  • Server: 关于所用服务器软件的信息。
  • Content-Type: 响应体的媒体类型。
  • Content-Length: 响应体的字节长度。
  • Content-Encoding: 应用于响应体的任何编码(例如,压缩)。
  • Last-Modified / ETag: 用于缓存的验证器。
  • Cache-Control / Expires: 缓存指令。
  • Set-Cookie: 指示客户端存储一个 cookie。
  • Location: 在重定向响应(3xx)中使用,指定新的 URL。
  • Allow: 列出资源支持的 HTTP 方法(通常与 405 Method Not Allowed 一起使用)。
  • WWW-Authenticate: 与 401 Unauthorized 响应一起发送,定义身份验证挑战。
  • Strict-Transport-Security: 指示浏览器将来对此域名的请求仅使用 HTTPS。
  • Content-Security-Policy: 通过指定允许的内容源来帮助防止 XSS 攻击。

开发者也可以包含自定义头部,用于应用程序特定的目的。

示例 1:成功响应,包含 HTML 内容 (200 OK)

HTTP/1.1 200 OK
Date: Mon, 21 Feb 2022 12:30:00 GMT
Server: MyWebServer/1.0
Last-Modified: Sun, 20 Feb 2022 10:00:00 GMT
ETag: "xyz123abc"
Content-Type: text/html; charset=utf-8
Content-Length: 150
Connection: keep-alive
Cache-Control: max-age=3600
<!DOCTYPE html>
<html>
<head><title>Success</title></head>
<body><h1>Hello, World!</h1><p>This is a sample page.</p></body>
</html>

示例 2:资源未找到 (404 Not Found)

HTTP/1.1 404 Not Found
Date: Mon, 21 Feb 2022 12:35:00 GMT
Server: MyWebServer/1.0
Content-Type: application/json; charset=utf-8
Content-Length: 36
Connection: close
{
"error": "Resource not found"
}

示例 3:重定向 (301 Moved Permanently)

HTTP/1.1 301 Moved Permanently
Date: Mon, 21 Feb 2022 12:40:00 GMT
Server: MyWebServer/1.0
Location: https://www.newexample.com/newpage.html
Content-Length: 0
Connection: keep-alive
(301 通常没有消息体,或者为旧客户端提供简短的 HTML 说明)