curlが*空の応答*を受け取ったときの接続のトラブルシューティング方法


27

Webサーバーへのcurl要求が機能しない理由のトラブルシューティングを進める方法を知りたいです。私の環境に依存するヘルプを探しているのではなく、通信のどの部分が失敗しているか、ポート番号などに関する情報を収集する方法を知りたいだけです。

chad-integration:~ # curl -v 111.222.159.30
* About to connect() to 111.222.159.30 port 80 (#0)
*   Trying 111.222.159.30... connected
* Connected to 111.222.159.30 (111.222.159.30) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
> Host: 111.222.159.30
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host 111.222.159.30 left intact
curl: (52) Empty reply from server
* Closing connection #0

したがって、空の応答は、curlがサーバーから応答を受け取らなかったことを意味することを理解しています。問題ありません。まさに私が理解しようとしていることです。

しかし、ここでcURLから得られる具体的な情報は何ですか?

正常に「接続」できたので、双方向通信が必要になりませんか?もしそうなら、なぜ応答も来ないのですか?注:サービスが稼働し、応答を返すことを確認しました。

注意してください、私はこのレベルのネットワークでは少し環境に優しいので、一般的なオリエンテーション資料を提供してください。


1
同じエラーが発生していましたが、私の場合は、特定のネットワークトラフィックを傍受およびブロックしていたのはVPNソフトウェアでした。詳細はこちらをご覧ください:stackoverflow.com/a/24189367/703200
クリスバートリー

回答:


16

クライアント側ではなく、サーバー側からトラブルシューティングする必要があります。「空の応答」と「応答なし」を混同していると思います。それらは同じことを意味しません。データが含まれていない返信を受け取っている可能性があります。

これをテストするには、curlを使用する代わりに、単にtelnetを使用します。

telnet 111.222.159.30 80

接続したら、次を貼り付けます(curl出力から取得)。

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: 111.222.159.30
Accept: */*

curlが見ているとおりに、応答が表示されるはずです。

空の応答が返される理由の1つは、名前ベースの仮想ホストであるWebサイトにアクセスしようとしていることです。その場合、サーバーの構成に応じて(ヒットしようとしているサイトはデフォルトとして構成されます)、少しの作業を行わないとIPアドレスでサイトにアクセスできません。

上記の「ホスト」行を変更するだけで、クライアント側でテストできます。www.example.comを、アクセスしようとしているサイトに置き換えます。

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: www.example.com
Accept: */*

別のクライアントからページを正常に戻すことができます。クライアントが接続している特定のネットワークに固有のものだと思います。
チャド

そして、空の応答=応答なしについては、stackoverflow.com / questions / 5929971 /… から取得しましたが、セカンドオピニオンを検討したいと思います;)
chad

1
サーバー側からトラブルシューティングする必要があります。サーバーがデータを送信していない場合、クライアントはその理由を知りません。それが得られなかったことを知っているだけです。empty vs noに関しては、curlが「空の」応答について文句を言っているサーバーを見つけ、間違いなく応答を受け取りました。 * Empty reply from servercurlから、直接接続すると、関連するすべてのhttpヘッダーが、純粋にで構成される本体とともに表示されました<!-- b5 -->。特定のネットワークではなく、他の場所のcurlで動作する場合は、そのネットワークの違いを調べます。おそらく動作の悪いプロキシですか?
Yoonix

7

Curlは問題ありませんが、物事がうまくいかなくても多くのフィードバックを提供しません。(おわかりのように)wgetは詳細を提供しますが、yoonixが言及しているように、サーバー側(Webサーバーのエラーログなど)を調べる場所です。

wget -S -O /dev/null http://www.example.com

ホスト名も設定できます

wget -s -O /dev/null --header="Host: foo.bar" http://www.example.com

2

これを試してください-> cURLを経由する代わりに、Telnetでアクセスしようとしているサイトにpingを実行してください。接続試行が返す応答は、cURLが接続しようとしたときに表示されるものとまったく同じになります(ただし、ユーザーからの助けにはなりません)。ここで、表示内容に応じて、いくつかの結論のうちの1つを引き出すことができます。

名前ベースの仮想ホストであるWebサイトに接続しようとしています。つまり、IPアドレス経由ではアクセスできません。ホスト名に何か問題があります-何か間違った入力をした可能性があります。パラメーターにPOSTではなくGETを使用すると、より具体的な答えが得られることに注意してください。

この問題は、100-continueヘッダーに関連している場合もあります。curl_getinfo($ ch、CURLINFO_HTTP_CODE)を実行して、結果を確認してください。


1
注(同じ答えを別のcURLの質問に投稿したのを見たので):これらの質問は、参照しているPHPラッパーの実装ではなく、cURL、CLIバイナリに関するものです。つまり、getinfoCLI cURLのフラグや機能などはありません。@see curl.haxx.se
ken

0

場合によっては、WindowsのWSLの下で。bash内でcurlを実行すると同じエラーが生成されます。これは、KasperksyがHTTP / sへの接続をブロックしているためです。

このバグはここで報告されています

簡単な解決策は、サーバーで到達しようとしているポートでKasperskyの保護を無効にすることです(例:TCP 80)。

これは、Kasperskyの[設定]-[ネットワーク設定]-[選択したポートのみを監視する]にチェックを入れてください。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.