我在实现简单的Web服务器时遇到了问题。根据规范,HTTP/1.1 request从这一行开始:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
在这一行中,有一个Request-URI
,其定义如下:
Request-URI = "*" | absoluteURI | abs_path | authority
因此,我可以发送完整的URI(包含架构,服务器名称等)或abs_path
(authority
,如规范中所定义,仅适用于{{1 }} 方法)。然后我有:
CONNECT
这些定义来自URI spec,它在HTTP规范中链接。如我们所见,abs_path = "/" path_segments
path_segments = segment *( "/" segment )
只是一个绝对路径,没有查询。
到目前为止的理论。现在,当我实际向abs_path
发送HTTP GET请求时,会发送此行:
http://example.com/?key=value
我尝试使用Firefox,Chrome和GET /?key=value HTTP/1.1
。根据规格,这不应该是违法的吗?我在监督什么吗?
答案 0 :(得分:3)
您的问题是您正在查看过时版本的规范。
请参阅https://www.greenbytes.de/tech/webdav/rfc7230.html#origin-form了解正确的ABNF。
答案 1 :(得分:2)
这是RFC 2616中的一个已知错误:
request-line
的定义使用request-target
(而不是Request-URI
),这允许origin-form
(而不是abs_path
):
origin-form = absolute-path [ "?" query ]