0

telnet メカニズムを使用して、http 要求をサーバーに送信し、応答を取得しています。HTTP GET リクエストの送信に telnet を使用しているときに、奇妙なことに気付きました。最初の方法はほとんどの環境で機能しますが、環境の 1 つでは機能しません。しかし、2 番目の方法 (相対パスではなく完全パスを使用) は、この環境では正常に機能しています。

**

  • 方法1:

**

(printf "GET /test.jsp HTTP/1.0\nAccept: */*\nUser-Agent: WatchDog\n\n"; sleep 9) | telnet xx.xx.xx.xx 8093 Trying xx.xxx.xx.xx... xx.xx.xx.xx に接続しました。エスケープ文字は「^]」です。

接続は外部ホストによって閉じられました。

**

  • 方法 2:

**

(printf "GET http://xx.xx.xx.xx:8093/test.jsp HTTP/1.0\nAccept: */*\nUser-Agent: WatchDog\n\n"; sleep 9) | telnet 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 つの環境だけで実行されないのはなぜですか? その環境で何かを確認する必要がありますか?

Plsはあなたの提案をしてください...

ありがとう、セカール

4

2 に答える 2

1

HTTP / 1.0(RF​​C 1945)は、CRLFで終わる行を指定します。一部のサーバーは、このルールを厳密に適用する場合があります。行末として\r\nを使用してリクエストを送信してみてください。絶対URIの送信も、プロキシで使用するために予約されています(RFC 1945のセクション5.1.2)。

行末とURIスタイルを変えても役に立たない場合は、方法1で何も問題がないため、サーバーの構成/実装を確認する必要があります。

于 2012-12-04T10:01:06.177 に答える
1

\r\nでなければならない行末と、*/*代わりにすべき受け入れヘッダーを除いて/、最初のリクエストにはホスト名がありません。

HTTP 1.1 サーバーは、絶対要求 URI またはホスト ヘッダーのいずれかにホストが設定されていない HTTP 要求を拒否する場合があります。

于 2012-12-04T10:14:06.360 に答える