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.