通过 telnet 获取对简单 HTTP GET 请求的“400 Bad Request”响应

Pie*_*thé 1 networking telnet http

我正在学习一些网络知识,但在第一个练习中遇到了问题:
我应该使用 telnet 向 httpbin.org 发送一个基本的 HTTP GET 请求。
这是我输入的内容:

$ telnet www.httpbin.org 80
Trying 23.23.171.5...
Connected to www.httpbin.org.herokudns.com.
Escape character is '^]'.
GET /ip HTTP/1.0
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

HTTP/1.1 400 Bad Request
Server: Cowboy
Date: Tue, 09 Jan 2018 20:06:36 GMT
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Spi*_*iff 5

问题是在需要 HTTP 1.1 的服务器上使用 HTTP 1.0(以及作为 HTTP 1.1Host:强制性部分的标头),可能是因为它可能在一个 IP 地址上对多个网站进行虚拟托管。或者,它可能在一个 HTTP 负载平衡器或反向代理背后,它们基本上在做同样的事情:在一个 IP 地址和端口后面支持多个单独的 Web 服务器域名。

这对我有用:

$ telnet www.httpbin.org 80
正在尝试 23.23.171.5...
连接到 www.httpbin.org.herokudns.com。
转义字符是“^]”。
获取 /ip HTTP/1.1
主持人:www.httpbin.org

……我回来了……

HTTP/1.1 200 正常
连接:保持连接
服务器:meinheld/0.6.1
日期:2018 年 1 月 9 日,星期二 22:01:19 GMT
内容类型:应用程序/json
访问控制允许来源:*
访问控制允许凭据:true
X-Powered-By:烧瓶
X 处理时间:0.000454902648926
内容长度:32
通过:1.1 vegur

{
  "origin": "[我的 IPv4 地址已编辑]"
}

^]
远程登录> 关闭
$ 

请注意,连接保持打开状态,我不得不退出telnet>提示以关闭。我本可以通过向Connection: close我的请求添加标头来避免这种情况。

如果您尝试带有Host:标头的HTTP/1.1并且它仍然不适合您,请确保您的 telnet 客户端正在发送 CRLF 而不仅仅是回车或换行符。确保在最后一行之后以额外的 CRLF 结束您的请求。