Frage Wie behebt man die Konnektivität, wenn curl eine * leere Antwort erhält *


Ich möchte wissen, wie man bei der Fehlersuche vorgeht, warum eine Curl-Anfrage an einen Webserver nicht funktioniert. Ich bin nicht auf der Suche nach Hilfe, die von meiner Umgebung abhängig wäre, ich möchte nur wissen, wie man Informationen darüber sammelt, welcher Teil der Kommunikation fehlschlägt, Portnummern usw.

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

Also, ich verstehe, dass eine leere Antwort bedeutet, dass curl keine Antwort vom Server bekommen hat. Kein Problem, genau das versuche ich herauszufinden.

Aber welche spezifischeren Informationen kann ich hier von cURL herleiten?

Es konnte erfolgreich "verbunden" werden, also beinhaltet das nicht eine bidirektionale Kommunikation? Wenn ja, warum kommt dann auch die Antwort nicht? Hinweis: Ich habe bestätigt, dass mein Dienst aktiv ist und Antworten zurückgegeben.

Beachten Sie, dass ich auf dieser Netzwerkebene ein wenig grün bin.


21
2017-10-17 18:29


Ursprung


Ich bekam denselben Fehler, aber in meinem Fall war es eine VPN-Software, die bestimmten Netzwerkverkehr abfing und blockierte. Sehen Sie hier für mehr: stackoverflow.com/a/24189367/703200 - Chris Bartley


Antworten:


Wahrscheinlich müssen Sie dies von der Serverseite und nicht von der Clientseite aus beheben. Ich glaube, Sie verwechseln eine "leere Antwort" mit "keine Antwort". Sie meinen nicht das Gleiche. Wahrscheinlich erhalten Sie eine Antwort, die keine Daten enthält.

Sie können dies testen, indem Sie einfach telnet verwenden, anstatt durch curl zu gehen:

telnet 111.222.159.30 80

Sobald Sie verbunden sind, fügen Sie Folgendes ein (aus Ihrer Curl-Ausgabe):

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: */*

Sie sollten die Antwort genau sehen, wenn curl sie sieht.

Ein möglicher Grund dafür, dass Sie eine leere Antwort erhalten, besteht darin, dass Sie versuchen, eine Website zu erreichen, bei der es sich um einen namensbasierten virtuellen Host handelt. Wenn dies der Fall ist, können Sie abhängig von der Serverkonfiguration (die Website, die Sie versuchen zu treffen, zufällig als Standard konfiguriert wird) die Website nicht ohne ein bisschen Arbeit per IP-Adresse erreichen.

Sie können dies auf der Client-Seite testen, indem Sie einfach die Zeile 'Host' oben ändern; Ersetzen Sie www.example.com durch die Website, die Sie erreichen möchten:

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: */*

14
2017-10-17 20:04



Ich kann die Seite erfolgreich von einem anderen Client abrufen. Es ist spezifisch für bestimmte Netzwerke, auf denen der Client vielleicht ist, denke ich. - chad
Und bezüglich der leeren Antwort = keine Antwort, ich habe das von stackoverflow.com/questions/5929971/ ...  , aber ich bin bereit, eine zweite Meinung zu erwägen;) - chad
Sie müssen es immer noch von der Serverseite aus beheben. Wenn der Server die Daten nicht sendet, weiß der Client nicht warum. Es weiß nur, dass es es nicht verstanden hat. Wie für leer vs nein, fand ich einen Server, der sich über eine 'leere' Antwort beschwerte und ich erhielt definitiv eine Antwort. * Empty reply from server Von curl aus zeigte das direkte Verbinden alle relevanten HTTP Header mit dem Körper, der rein aus bestand <!-- b5 -->. Wenn es anderswo und nicht in einem bestimmten Netzwerk funktioniert, würde ich mir die Unterschiede in diesem Netzwerk ansehen. Vielleicht ein Proxy mit schlechtem Verhalten? - yoonix


Curl ist in Ordnung, gibt aber nicht viel Rückmeldung, wenn etwas schief läuft. (Wie Sie sehen können) wget kann Ihnen mehr Informationen geben, aber wie yoonix erwähnt, ist Server-Seite (dh Webserver Fehlerprotokolle) der Ort zu suchen.

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

Sie können auch Hostnamen mit angeben

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

6
2017-10-17 20:54





Versuchen diese -> Anstatt cURL zu durchlaufen, versuchen Sie, die Seite, die Sie mit Telnet erreichen möchten, mit einem Ping zu versehen. Die Antwort, die Ihr Verbindungsversuch zurückgibt, ist genau das, was cURL sieht, wenn es versucht, eine Verbindung herzustellen (was aber nicht hilfreich ist). Nun, abhängig davon, was Sie hier sehen, können Sie eine von mehreren Schlussfolgerungen ziehen:

Sie versuchen, eine Verbindung zu einer Website herzustellen, bei der es sich um einen namensbasierten virtuellen Host handelt. Dies bedeutet, dass sie nicht über die IP-Adresse erreicht werden kann. Beim Hostnamen ist etwas falsch gelaufen - Sie haben sich möglicherweise etwas vertippt. Beachten Sie, dass die Verwendung von GET anstelle von POST für Parameter Ihnen eine konkretere Antwort gibt.

Das Problem kann auch mit dem Header 100-continue verknüpft sein. Versuchen Sie curl_getinfo ($ ch, CURLINFO_HTTP_CODE) auszuführen und überprüfen Sie das Ergebnis.


2
2017-09-07 20:29



Hinweis (da ich gesehen habe, dass Sie dieselbe Antwort in einer anderen cURL-Frage gepostet haben): Diese Fragen betreffen cURL, die CLI-Binärdatei und nicht die PHP-Wrapper-Implementierung, auf die Sie verweisen. Mit anderen Worten, es gibt keine a getinfo Flag oder Feature für CLI cURL. @sehen curl.haxx.se - ken