วิธีแก้ไขปัญหาการเชื่อมต่อเมื่อ curl ได้รับ * การตอบสนองที่ว่างเปล่า *


27

ฉันต้องการทราบวิธีดำเนินการแก้ไขปัญหาต่อไปว่าทำไม 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
Chris Bartley

คำตอบ:


16

คุณอาจจะต้องแก้ไขปัญหานี้จากฝั่งเซิร์ฟเวอร์ไม่ใช่ฝั่งไคลเอ็นต์ ฉันเชื่อว่าคุณกำลังสับสนกับ 'การตอบสนองที่ว่างเปล่า' กับ 'ไม่ตอบสนอง' พวกเขาไม่ได้หมายถึงสิ่งเดียวกัน ดูเหมือนว่าคุณจะได้รับการตอบกลับที่ไม่มีข้อมูลใด ๆ

คุณสามารถทดสอบสิ่งนี้ได้โดยใช้ telnet แทนการทำ curl

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 เห็น

เหตุผลหนึ่งที่เป็นไปได้ที่คุณได้รับการตอบกลับที่ว่างเปล่าคือคุณกำลังพยายามเข้าชมเว็บไซต์ที่เป็นโฮสต์เสมือนตามชื่อ หากเป็นกรณีนี้ขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์ (ไซต์ที่คุณพยายามจะตีเกิดขึ้นจะถูกกำหนดค่าเป็นค่าเริ่มต้น) คุณไม่สามารถเข้าถึงเว็บไซต์ด้วยที่อยู่ 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/... แต่ฉันยินดีที่จะพิจารณาความเห็นที่สอง;)
ชาด

1
คุณยังคงต้องแก้ไขปัญหาจากฝั่งเซิร์ฟเวอร์ หากเซิร์ฟเวอร์ไม่ได้ส่งข้อมูลลูกค้าจะไม่ทราบสาเหตุ มันรู้แค่ว่ามันไม่ได้ สำหรับ vs เปล่าฉันพบเซิร์ฟเวอร์ที่ขดบ่นเกี่ยวกับการตอบสนอง 'ว่าง' และฉันได้รับการตอบกลับอย่างแน่นอน * Empty reply from serverจากขดเชื่อมต่อโดยตรงทั้งหมดแสดงให้เห็นส่วนหัว HTTP <!-- b5 -->ที่เกี่ยวข้องกับร่างกายประกอบด้วยหมดจด ถ้ามันทำงานได้ดีกับที่อื่น ๆ และไม่ได้อยู่ในเครือข่ายเดียวฉันจะดูความแตกต่างของเครือข่าย พร็อกซีที่มีพฤติกรรมไม่ดีอาจจะใช่ไหม
yoonix

7

Curl เป็นเรื่องปกติ แต่ไม่ได้ให้ข้อเสนอแนะมากเมื่อสิ่งที่ผิดไป (อย่างที่คุณบอก) wget อาจให้ข้อมูลเพิ่มเติมแก่คุณ แต่เมื่อ yoonix กล่าวถึงฝั่งเซิร์ฟเวอร์ (เช่นบันทึกข้อผิดพลาดของเว็บเซิร์ฟเวอร์) เป็นที่ที่ควรมองหา

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

คุณสามารถตั้งค่าชื่อโฮสต์ได้ด้วย

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

2

ลองใช้สิ่งนี้ -> แทนที่จะดูผ่าน cURL ลองส่ง Ping ไซต์ที่คุณพยายามติดต่อด้วย Telnet การตอบสนองที่ความพยายามในการเชื่อมต่อของคุณส่งคืนจะเป็นสิ่งที่ cURL เห็นเมื่อพยายามเชื่อมต่อ ตอนนี้ขึ้นอยู่กับสิ่งที่คุณเห็นที่นี่คุณอาจสรุปหนึ่งในหลาย ๆ

คุณกำลังพยายามเชื่อมต่อกับเว็บไซต์ที่เป็นโฮสต์เสมือนตามชื่อหมายความว่าไม่สามารถเข้าถึงได้ผ่านทางที่อยู่ IP มีบางอย่างผิดพลาดกับชื่อโฮสต์ - คุณอาจพิมพ์ผิดบางอย่าง โปรดทราบว่าการใช้ GET แทน POST สำหรับพารามิเตอร์จะให้คำตอบที่เป็นรูปธรรมมากขึ้น

ปัญหานี้อาจเชื่อมโยงกับส่วนหัว 100 ต่อ ลองใช้ curl_getinfo ($ ch, CURLINFO_HTTP_CODE) และตรวจสอบผลลัพธ์


1
หมายเหตุ (เนื่องจากฉันเห็นคุณโพสต์คำตอบเดียวกันนี้ในคำถาม cURL ที่แตกต่างกัน): คำถามเหล่านี้เกี่ยวกับ cURL, ไบนารี CLI และไม่ใช่การใช้งาน wrapper PHP ที่คุณอ้างอิง กล่าวอีกนัยหนึ่งไม่มีสิ่งเช่นgetinfoธงหรือคุณลักษณะสำหรับ CLI cURL @see curl.haxx.se
ken

0

ในบางโอกาสภายใต้ WSL ของ Windows การเรียกใช้ curl ข้างใน bash จะทำให้เกิดข้อผิดพลาดเหมือนกันและนั่นเป็นเพราะ Kasperksy กำลังบล็อกไม่ให้เชื่อมต่อกับ HTTP

ข้อผิดพลาดนี้ได้รับการรายงานที่นี่

วิธีแก้ปัญหาอย่างรวดเร็วคือปิดการใช้งานการป้องกันของ Kaspersky บนพอร์ตที่คุณพยายามเข้าถึงบนเซิร์ฟเวอร์ (tcp 80 สำหรับ exmaple)

สิ่งนี้ทำได้โดยไปที่ Kaspersky - การตั้งค่า - การตั้งค่าเครือข่าย - ทำเครื่องหมาย "ตรวจสอบพอร์ตที่เลือกเท่านั้น" - เลือกพอร์ต - ดับเบิลคลิกบนพอร์ต (80) และเลือกไม่ทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.