HTTP 服务器应该如何处理指定高于 HTTP/1.1 协议的请求?

HTTP 服务器应该如何处理指定高于 HTTP/1.1 协议的请求?

我从头创建了一个 HTTPS 服务器,用于嵌入式应用程序。

目前,它在接收请求时能够区分 HTTP/1.0 和 HTTP/1.1,然后相应地处理请求。例如,根据 HTTP 版本正确处理连接持久性的不同工作方式。

我的问题与服务器在收到 HTTP 协议版本高于 1.1 的请求时应如何反应有关。我知道 2.0 正在开发中,但我不知道我的服务器何时可能收到版本号高于 1.1 的请求。显然,现在是让它面向未来的时候了。

假设服务器最多只符合 RFC2616(HTTP 1.1),那么对协议高于 1.1 的请求的正确响应是否是使用 HTTP/1.1 响应进行响应,然后将事务作为 HTTP 1.1 处理?

我目前正在执行的操作是执行简单的字符串匹配,以检测请求标头中的 HTTP/1.0 或 HTTP/1.1。如果两者都未看到,它将把请求视为 HTTP/1.0,但现在我认为这并不正确。

我再次阅读了 RFC2616 以获取有关此问题的指导,特别是第 3 部分:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3

但从这一点来看,我无法完全理解服务器应用程序应该如何响应未来的 HTTP 版本。

我知道的另一种选择是用 进行响应505 HTTP Version Not Supported。如果我收到的请求版本高于 HTTP/1.1,我可能会返回此信息。我猜想这样做会导致任何未来的浏览器使用较低的 HTTP 版本号(例如 HTTP/1.1)再次尝试。

答案1

telnet在 Linux 终端中输入我自己的原始 HTTP 请求,其中包含各种 HTTP 版本。以下是我发现的内容:

对 Microsoft IIS 7.5 服务器的请求:

GET / HTTP/1.2导致服务器正常响应,使用 HTTP/1.1。

GET / HTTP/1.1234导致服务器正常响应,使用 HTTP/1.1。

GET / HTTP/2.0导致服务器响应HTTP/1.1 505 HTTP Version Not Supported

接下来我尝试了 Apache 服务器。它的行为有所不同,即使请求中的主要 HTTP 版本大于 1,它也始终会愉快地响应(例如HTTP 200)。即使我使用 HTTP 版本(例如 3.1234),它也会返回页面(而不是抛出)。HTTP/1.1505

因此,根据 IIS 和 Apache 服务器的行为方式:

  • 只要 HTTP 主版本号为 1,若次版本号大于 1(例如 1.2、1.1234),则应处理请求,但响应应说明HTTP/1.1

  • 如果主 HTTP 版本号不是 1,那么我就可以决定是否返回505 HTTP Version Not Supported或处理请求HTTP/1.1。为简单起见,我将选择后者。

相关内容