Beheben von Verbindungsproblemen, wenn beim Einrollen eine * leere Antwort * angezeigt wird


27

Ich möchte wissen, wie bei der Fehlerbehebung vorgegangen wird, warum eine Aufforderung zum Einrollen an einen Webserver nicht funktioniert. Ich suche keine Hilfe, die von meiner Umgebung abhängt. Ich möchte nur wissen, wie ich Informationen darüber sammeln kann, welcher Teil der Kommunikation fehlerhaft ist, wie 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

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

Aber welche genaueren Informationen kann ich hier aus cURL ableiten?

Die Verbindung konnte erfolgreich hergestellt werden. Handelt es sich also nicht um eine bidirektionale Kommunikation? Wenn ja, warum kommt die Antwort dann auch nicht? Hinweis: Ich habe festgestellt, dass mein Dienst verfügbar ist und Antworten zurückgesendet werden.

Beachten Sie, dass ich auf dieser Ebene der Vernetzung ein bisschen grün bin. Sie können also allgemeines Orientierungsmaterial bereitstellen.


1
Ich bekam den gleichen Fehler, aber in meinem Fall war es VPN-Software, die bestimmten Netzwerkverkehr abfing und blockierte. Weitere Informationen finden
Chris Bartley

Antworten:


16

Möglicherweise müssen Sie dies auf der Serverseite und nicht auf der Clientseite beheben. Ich glaube, Sie verwechseln eine "leere Antwort" mit "keine Antwort". Sie bedeuten nicht dasselbe. Wahrscheinlich erhalten Sie eine Antwort, die keine Daten enthält.

Sie können dies testen, indem Sie einfach Telnet verwenden, anstatt sich zu locken:

telnet 111.222.159.30 80

Sobald die Verbindung hergestellt ist, 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 so sehen, wie Curl sie sieht.

Ein möglicher Grund, warum Sie eine leere Antwort erhalten, besteht darin, dass Sie versuchen, auf eine Website zuzugreifen, die ein namensbasierter virtueller Host ist. In diesem Fall können Sie die Site abhängig von der Serverkonfiguration (die Site, auf die Sie zugreifen möchten, ist standardmäßig konfiguriert) nicht ohne viel Arbeit über die IP-Adresse erreichen.

Sie können dies auf der Client-Seite testen, indem Sie einfach die 'Host'-Zeile oben ändern. Ersetzen Sie www.example.com durch die Site, 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: */*

Ich kann die Seite erfolgreich von einem anderen Client zurückholen. Es ist spezifisch für bestimmte Netzwerke, in denen sich der Client möglicherweise befindet, denke ich.
Tschad

Und was die leere Antwort = keine Antwort betrifft , habe ich das von stackoverflow.com/questions/5929971/… erhalten , aber ich bin bereit, eine zweite Meinung zu berücksichtigen;)
Tschad

1
Sie müssten immer noch Probleme auf der Serverseite beheben. Wenn der Server die Daten nicht sendet, weiß der Client nicht warum. Es weiß nur, dass es es nicht verstanden hat. In Bezug auf leer vs nein habe ich einen Server gefunden, der sich über eine "leere" Antwort beschwert hat, und ich habe definitiv eine Antwort erhalten. * Empty reply from serverBeim direkten Verbinden werden alle relevanten http-Header mit dem Körper angezeigt, der lediglich aus besteht <!-- b5 -->. Wenn es mit Curl anderswo und nicht in einem bestimmten Netzwerk funktioniert, würde ich die Unterschiede in diesem Netzwerk untersuchen. Ein schlechtes Proxy-Verhalten vielleicht?
Yoonix

7

Curl ist in Ordnung, gibt aber nicht viel Feedback, wenn etwas schief geht. (Wie Sie sehen können) wget kann Ihnen mehr Informationen geben, aber wie Yoonix erwähnt, ist die Serverseite (dh Webserver-Fehlerprotokolle) der Ort, an dem Sie suchen müssen.

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

Sie können mit auch Hostnamen setzen

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

2

Versuchen Sie diese -> Statt durch cURL, versuchen Sie die Seite Pingen Sie versuchen , mit Telnet zu erreichen. Die Antwort, die Ihr Verbindungsversuch zurückgibt, ist genau das, was cURL sieht, wenn es versucht, eine Verbindung herzustellen (was es Ihnen jedoch nicht behilflich macht). Je nachdem, was Sie hier sehen, können Sie eine von mehreren Schlussfolgerungen ziehen:

Sie versuchen, eine Verbindung zu einer Website herzustellen, die ein namensbasierter virtueller Host ist, dh, sie kann nicht über die IP-Adresse erreicht werden. Der Hostname stimmt nicht - Sie haben möglicherweise etwas falsch geschrieben. Beachten Sie, dass die Verwendung von GET anstelle von POST für Parameter eine konkretere Antwort liefert.

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


1
Hinweis (da ich gesehen habe, dass Sie dieselbe Antwort in einer anderen cURL-Frage gestellt haben): Bei diesen Fragen handelt es sich um cURL, die CLI-Binärdatei und nicht um die PHP-Wrapper-Implementierung, auf die Sie verweisen. Mit anderen Worten, es gibt kein getinfoFlag oder Feature für CLI-CURL. @see curl.haxx.se
Ken

0

In einigen Fällen unter Windows WSL. Das Ausführen von curl inside bash erzeugt den gleichen Fehler, da Kasperksy die Verbindung zu HTTP / s blockiert.

Dieser Fehler wurde gemeldet hier .

Eine schnelle Lösung besteht darin, den Schutz von Kaspersky für den Port zu deaktivieren, den Sie auf dem Server erreichen möchten (z. B. TCP 80).

Gehen Sie dazu zu Kaspersky - Einstellungen - Netzwerkeinstellungen - aktivieren Sie das Kontrollkästchen "Nur ausgewählte Ports überwachen" - Ports auswählen - doppelklicken Sie auf den Port (80) und wählen Sie "Inaktiv"

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.