HTTP请求至少需要什么?

Naf*_*Kay 68 http

我正在尝试netcat通过执行以下操作向我的本地服务器发出GET命令:

echo -e "GET / HTTP/1.1\nHost: localhost" | nc localhost 80
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到了HTTP/1.1 400 Bad Request回应.HTTP请求至少需要什么?

Abh*_*Oza 66

如果请求是:"GET / HTTP/1.0\r\n\r\n"那么响应包含标题和正文,并在响应后关闭连接.

如果请求是:"GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" 那么响应包含标题和正文,并在响应后关闭连接.

如果请求是:"GET / HTTP/1.1\r\nHost: host:port\r\n\r\n"那么响应包含标题和正文,即使在响应之后连接也不会关闭.

如果您的请求是:"GET /\r\n\r\n"那么响应不包含标题且仅包含正文,并且响应后连接将关闭.

如果您的请求是:"HEAD / HTTP/1.0\r\n\r\n"那么响应只包含标题而没有正文,并且响应后连接关闭.

如果请求是:"HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n"那么响应只包含标题而没有正文,并且响应后连接关闭.

如果请求是:"HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n"那么响应只包含标题而没有正文,并且响应后连接不会关闭.

  • RFC 2616已过时.除历史目的外,请不要再引用它. (4认同)
  • @JFSebastian 对于 HTTP 1.1 连接:http://tools.ietf.org/html/rfc2616#section-8 ,对于 HTTP 1.1 主机:http://tools.ietf.org/html/rfc2616#section-14.23 ,对于 HTTP 1.0 http://tools.ietf.org/html/rfc1945 ,对于 HTTP 0.9 http://www.w3.org/Protocols/HTTP/AsImplemented.html ,HTTP 持久连接:http://en.wikipedia.org/ wiki/Hypertext_Transfer_Protocol#Persistent_connections(对于持久连接的解释,我给出了维基百科链接,因为它有更好的解释) (2认同)

Jos*_*Lee 62

它必须使用CRLF行结尾,并且必须\r\n\r\n以空白行结束.这是我使用的:

printf 'GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n' |
  nc www.example.com 80
Run Code Online (Sandbox Code Playgroud)

此外,我喜欢printfecho,我添加一个额外的头让服务器关闭连接,但这些都是没有必要的.

  • 主机应该只是`localhost`而不是`localhost 80` (3认同)

小智 11

请参阅Wiki:HTTP客户端请求(示例).

请注意以下事项:

客户端请求(包括请求行的这种情况,只有一个标题)后跟一个空行,以便请求以双换行结束,每个换行符以回车符后跟换行符的形式."主机"标头区分共享单个IP地址的各种DNS名称,允许基于名称的虚拟主机.虽然在HTTP/1.0中是可选的,但它在HTTP/1.1中是必需的.

绝对最小值(如果允许删除主机;-) GET / HTTP/1.0\r\n\r\n.

快乐的编码


jfk*_*ein 9

我能够从我的Apache服务器获得响应,只有所请求的文档,没有响应头,只是

GET /\r\n
Run Code Online (Sandbox Code Playgroud)

如果您想要响应标头,包括状态代码,那么您需要其中一个其他答案.

  • 有趣.这使用了90年代早期的原始[HTTP/0.9](http://www.w3.org/Protocols/HTTP/AsImplemented.html)协议.令我印象深刻的是Apache仍然对它做出回应. (6认同)

jch*_*jch 6

请,请,请不要在没有先阅读相关规范的情况下实现您自己的 HTTP 客户端。请阅读并确保您至少完全理解RFC 2616。(如果您雄心勃勃,请参阅 RFC 7230 至 7235)。

虽然 HTTP 看起来是一个简单的协议,但实际上它有很多微妙之处。任何编写过 HTTP 服务器的人都会告诉您他必须实现的解决方法,以便处理不正确但广泛部署的客户端。除非您热衷于阅读规范,否则请使用完善的客户端库;Curl是一个不错的选择,但我确信还有其他选择。

如果您要实现自己的:

  • 不要使用 HTTP/0.9;
  • HTTP/1.0需要查询行和空行;
  • 在HTTP/1.1中,Host:除了上述之外,标头也是强制性的。

在 HTTP/1.1 中省略Host:标头是 400 错误的最常见原因。


wbe*_*rry 5

在的事实400 Bad Request错误本身并不意味着你的要求违反了HTTP.服务器非常好,可能出于另一个原因给出这个响应.

据我所知,绝对最小有效HTTP请求是:

GET / HTTP/1.0\r\n\r\n
Run Code Online (Sandbox Code Playgroud)

  • 实际上,绝对最小值是"GET /\r \n".如果未指定版本,则服务器应假定为HTTP/0.9.在HTTP/0.9中,不允许使用请求标头,因此您不需要空行来终止它们.但是,我不希望在任何地方都支持这一点,因为HTTP/0.9客户端实际上非常罕见,因此服务器可能无法使用它们进行测试. (7认同)
  • HTTP/1.0不接受标头,HTTP/1.1具有强制标头:主机. (3认同)