使用 telnet 的 HTTP 请求没有得到任何响应
Posted
技术标签:
【中文标题】使用 telnet 的 HTTP 请求没有得到任何响应【英文标题】:HTTP request using telnet not getting any response 【发布时间】:2012-11-21 20:01:39 【问题描述】:我们使用 telnet 机制向服务器发送 http 请求并获得响应。 在使用 telnet 发送 HTTP GET 请求时,我们注意到了一件奇怪的事情。 第一种方法适用于大多数环境,但不适用于其中一个环境。但是第二种方法(而不是相对路径,使用完整路径)在这种环境下工作正常。
**
方法一:**
(printf "GET /test.jsp HTTP/1.0\nAccept: */*\nUser-Agent: WatchDog\n\n"; sleep 9) |远程登录 xx.xx.xx.xx 8093 正在尝试 xx.xxx.xx.xx... 连接到 xx.xx.xx.xx。 转义字符是'^]'。
连接被外部主机关闭。
**
方法二:**
(printf "GET http://xx.xx.xx.xx:8093/test.jsp HTTP/1.0\nAccept: */*\nUser-Agent: WatchDog\n\n"; sleep 9) |远程登录 xx.xx.xx.xx 8093
Trying xx.xx.xx.xx...
Connected to xx.xx.xx.xx.
Escape character is '^]'.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=91643475E80038EA8770CE6803EE320C; Path=/
Content-Type: text/html;charset=UTF-8
Content-Language: zh-US
Content-Length: 42
Date: Mon, 03 Dec 2012 04:25:09 GMT
Connection: close
The Server is Running
Connection closed by foreign host.
为什么method1 不能只在一个环境中运行?我们需要在那个环境中检查一些东西吗?
请提出您的建议...
谢谢, 塞卡
【问题讨论】:
【参考方案1】:HTTP/1.0 (RFC 1945) 指定以 CR LF 结尾的行。某些服务器可能会严格应用此规则。尝试以 \r\n 作为行尾发送请求。发送绝对 URI 也保留供代理使用(RFC 1945 的第 5.1.2 节)。
如果不同的行尾和 URI 样式对您没有帮助,您将不得不查看服务器配置/实现,因为我看不出方法 1 有什么问题。
【讨论】:
【参考方案2】:除了must be \r\n 的行尾和应为*/*
而不是/
的接受标头之外,您的第一个请求没有主机名。
HTTP 1.1 服务器可能会拒绝没有设置主机的 HTTP 请求,无论是在绝对请求 URI 中还是在主机头中。
【讨论】:
"HTTP 1.1 服务器可能会拒绝没有主机集的 HTTP 请求,无论是在绝对请求 URI 还是在主机标头中" -> 你能告诉我在哪些情况下可以发生?因为我们正在向没有主机的 HTTP 1.1 服务器发送 HTTP 请求,并且使用在大多数环境中都可以正常工作的相对路径。 @Sekhar 不,这是一个实施细节,应该与您的网络服务器制造商核实。 RFC 声明服务器可以"attempt to use heuristics (e.g., examination of the URI path for something unique to a particular host) in order to determine what exact resource is being requested."。如果您只是修复您的请求,即发出一个包含主机的有效 HTTP 请求,无论是在标头还是在 URL 中,并使用\r\n
来分隔标头,它应该适用于所有服务器。以上是关于使用 telnet 的 HTTP 请求没有得到任何响应的主要内容,如果未能解决你的问题,请参考以下文章