在接收和解析请求信息后,服务器用 HTTP 响应信息进行回应。

  1. Response = Status-Line ; Section 6.1
  2. *(( general-header ; Section 4.5
  3. | response-header ; Section 6.2
  4. | entity-header ) CRLF) ; Section 7.1
  5. CRLF
  6. [ message-body ] ; Section 7.2

6.1 状态行(Status-Line)

响应信息的第一行是状态行,由协议版本和数字状态代码及其相关的文本短语组成,每个元素之间用 SP 字符分隔。除了最后的 CRLF 序列,不允许有 CR 或 LF。

  1. Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

6.1.1 状态码和原因短语

状态代码 (Status-Code) 元素是一个 3 位数的整数结果代码,是理解和满足请求的尝试。这些代码在第 10 节有完整的定义。Reason-Phrase 的目的是对 Status-Code 做一个简短的文本描述。状态代码是为自动机使用的,而原因短语是为人类用户准备的。客户端不需要检查或显示 “原因句”。

状态代码的第一个数字定义了响应的类别。后面两个数字不具有任何分类作用。第一个数字有 5 个值:

  • 1xx: 信息性 - 收到请求,继续处理
  • 2xx: 成功 - 该行动被成功接收、理解和接受
  • 3xx: 重定向 - 必须采取进一步行动以完成请求。
  • 4xx: 客户端错误 - 该请求包含错误的语法或无法完成
  • 5xx: 服务器错误 - 服务器未能满足一个明显有效的请求

下面是为 HTTP/1.1 定义的数字状态代码的单个值,以及一组相应的原因短语的例子。这里列出的原因短语只是建议—它们可以被本地的等价物取代而不影响协议。

  1. Status-Code =
  2. "100" ; Section 10.1.1: Continue
  3. | "101" ; Section 10.1.2: Switching Protocols
  4. | "200" ; Section 10.2.1: OK
  5. | "201" ; Section 10.2.2: Created
  6. | "202" ; Section 10.2.3: Accepted
  7. | "203" ; Section 10.2.4: Non-Authoritative Information
  8. | "204" ; Section 10.2.5: No Content
  9. | "205" ; Section 10.2.6: Reset Content
  10. | "206" ; Section 10.2.7: Partial Content
  11. | "300" ; Section 10.3.1: Multiple Choices
  12. | "301" ; Section 10.3.2: Moved Permanently
  13. | "302" ; Section 10.3.3: Found
  14. | "303" ; Section 10.3.4: See Other
  15. | "304" ; Section 10.3.5: Not Modified
  16. | "305" ; Section 10.3.6: Use Proxy
  17. | "307" ; Section 10.3.8: Temporary Redirect
  18. | "400" ; Section 10.4.1: Bad Request
  19. | "401" ; Section 10.4.2: Unauthorized
  20. | "402" ; Section 10.4.3: Payment Required
  21. | "403" ; Section 10.4.4: Forbidden
  22. | "404" ; Section 10.4.5: Not Found
  23. | "405" ; Section 10.4.6: Method Not Allowed
  24. | "406" ; Section 10.4.7: Not Acceptable
  25. | "407" ; Section 10.4.8: Proxy Authentication Required
  26. | "408" ; Section 10.4.9: Request Time-out
  27. | "409" ; Section 10.4.10: Conflict
  28. | "410" ; Section 10.4.11: Gone
  29. | "411" ; Section 10.4.12: Length Required
  30. | "412" ; Section 10.4.13: Precondition Failed
  31. | "413" ; Section 10.4.14: Request Entity Too Large
  32. | "414" ; Section 10.4.15: Request-URI Too Large
  33. | "415" ; Section 10.4.16: Unsupported Media Type
  34. | "416" ; Section 10.4.17: Requested range not satisfiable
  35. | "417" ; Section 10.4.18: Expectation Failed
  36. | "500" ; Section 10.5.1: Internal Server Error
  37. | "501" ; Section 10.5.2: Not Implemented
  38. | "502" ; Section 10.5.3: Bad Gateway
  39. | "503" ; Section 10.5.4: Service Unavailable
  40. | "504" ; Section 10.5.5: Gateway Time-out
  41. | "505" ; Section 10.5.6: HTTP Version not supported
  42. | extension-code
  43. extension-code = 3DIGIT
  44. Reason-Phrase = *<TEXT, excluding CR, LF>

HTTP 状态代码是可扩展的。HTTP 应用程序不需要理解所有注册状态码的含义,尽管这种理解显然是可取的。然而,应用程序必须理解任何状态代码的类别,如第一个数字所示,并将任何未识别的响应视为等同于该类别的x00 状态代码,但未识别的响应不得被缓存。例如,如果客户端收到 431 的未识别状态码,它可以安全地认为它的请求有问题,并把响应当作它收到 400 的状态码。在这种情况下,用户代理应该向用户展示与响应一起返回的实体,因为该实体可能包括人类可读的信息,这将解释不寻常的状态。

6.2 响应头字段

响应头字段允许服务器传递关于响应的额外信息,这些信息不能放在状态行中。这些头字段提供了关于服务器和进一步访问由 Request-URI 标识的资源的信息。

  1. response-header = Accept-Ranges ; Section 14.5
  2. | Age ; Section 14.6
  3. | ETag ; Section 14.19
  4. | Location ; Section 14.30
  5. | Proxy-Authenticate ; Section 14.33
  6. | Retry-After ; Section 14.37
  7. | Server ; Section 14.38
  8. | Vary ; Section 14.44
  9. | WWW-Authenticate ; Section 14.47

响应头字段的名称只有在协议版本改变的情况下才能被可靠地扩展。然而,如果通信中的所有各方都承认它们是响应头字段,那么新的或试验性的头字段可以被赋予响应头字段的语义。未被识别的头字段被当作实体头字段处理。