我正在尝试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"那么响应只包含标题而没有正文,并且响应后连接不会关闭.
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)
此外,我喜欢printf过echo,我添加一个额外的头让服务器关闭连接,但这些都是没有必要的.
小智 11
请注意以下事项:
客户端请求(包括请求行的这种情况,只有一个标题)后跟一个空行,以便请求以双换行结束,每个换行符以回车符后跟换行符的形式."主机"标头区分共享单个IP地址的各种DNS名称,允许基于名称的虚拟主机.虽然在HTTP/1.0中是可选的,但它在HTTP/1.1中是必需的.
绝对最小值(如果允许删除主机;-) GET / HTTP/1.0\r\n\r\n.
快乐的编码
我能够从我的Apache服务器获得响应,只有所请求的文档,没有响应头,只是
GET /\r\n
Run Code Online (Sandbox Code Playgroud)
如果您想要响应标头,包括状态代码,那么您需要其中一个其他答案.
请,请,请不要在没有先阅读相关规范的情况下实现您自己的 HTTP 客户端。请阅读并确保您至少完全理解RFC 2616。(如果您雄心勃勃,请参阅 RFC 7230 至 7235)。
虽然 HTTP 看起来是一个简单的协议,但实际上它有很多微妙之处。任何编写过 HTTP 服务器的人都会告诉您他必须实现的解决方法,以便处理不正确但广泛部署的客户端。除非您热衷于阅读规范,否则请使用完善的客户端库;Curl是一个不错的选择,但我确信还有其他选择。
如果您要实现自己的:
Host:除了上述之外,标头也是强制性的。在 HTTP/1.1 中省略Host:标头是 400 错误的最常见原因。
在的事实400 Bad Request错误本身并不意味着你的要求违反了HTTP.服务器非常好,可能出于另一个原因给出这个响应.
据我所知,绝对最小有效HTTP请求是:
GET / HTTP/1.0\r\n\r\n
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82040 次 |
| 最近记录: |