Skip to main content

9. Constructing an Effective Request URI (构造有效请求URI)

本节指定HSTS主机必须如何为接收到的HTTP请求构造有效请求URI.

HTTP请求通常不携带目标资源的absoluteURI; 相反, 需要从Request-URI、Host头字段和连接上下文推断URI ([RFC2616], 第3.2.1节, 第5.1.2节和第5.2节). 此过程的结果称为"有效请求URI (effective request URI, ERU)". "目标资源 (target resource)"是由有效请求URI标识的资源.

9.1 ERU Fundamental Definitions (ERU基本定义)

HTTP请求消息的第一行Request-Line由 [RFC2616] 第5.1节的以下ABNF指定:

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

Request-Line中的Request-URI由 [RFC2616] 第5.1.2节的以下ABNF指定:

Request-URI    = "*" | absoluteURI | abs_path | authority

Host请求头字段由 [RFC2616] 第14.23节的以下ABNF指定:

Host = "Host" ":" host [ ":" port ]

9.2 Determining the Effective Request URI (确定有效请求URI)

如果Request-URI是absoluteURI, 则有效请求URI是Request-URI.

如果Request-URI使用abs_path形式或星号形式, 并且Host头字段存在, 则通过连接以下内容构造有效请求URI:

  • 方案名称: 如果请求是通过不安全的TCP连接接收的, 则为"http", 或者当通过TLS/SSL保护的TCP连接接收时为"https", 并且

  • 八位字节序列"://", 并且

  • 来自Host头字段的主机和端口 (如果存在), 并且

  • 从Request-Line获得的Request-URI, 除非Request-URI只是星号"*".

如果Request-URI使用abs_path形式或星号形式, 并且Host头字段不存在, 则有效请求URI未定义.

否则, 当Request-URI使用authority形式时, 有效请求URI未定义.

使用 [RFC2616] 第3.2.3节中描述的规则比较有效请求URI, 但空路径组件禁止 (MUST NOT) 被视为等同于"/"的绝对路径.

9.2.1 Effective Request URI Examples (有效请求URI示例)

示例1: 消息的有效请求URI

GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.example.org:8080

(通过不安全的TCP连接接收) 是"http", 加上"://", 加上authority组件"www.example.org:8080", 加上request-target "/pub/WWW/TheProject.html". 因此, 它是http://www.example.org:8080/pub/WWW/TheProject.html.

示例2: 消息的有效请求URI

OPTIONS * HTTP/1.1
Host: www.example.org

(通过SSL/TLS保护的TCP连接接收) 是"https", 加上"://", 加上authority组件"www.example.org". 因此, 它是https://www.example.org.