รหัสข้อผิดพลาด curl: คู่มืออ้างอิงฉบับสมบูรณ์
เมื่อคำสั่ง curl ล้มเหลว จะส่งคืนรหัสออก (exit code) เป็นตัวเลข (หรือเรียกว่ารหัสข้อผิดพลาด curl) ที่ระบุประเภทของข้อผิดพลาด คุณสามารถตรวจสอบรหัสออกของ curl โดยรัน echo $? ทันทีหลังคำสั่ง curl (หรือ $LASTEXITCODE ใน PowerShell) รหัสออก 0 หมายถึงสำเร็จ; หมายเลขอื่นใดบ่งบอกปัญหาเฉพาะ — ตั้งแต่การแก้ไข DNS ล้มเหลว และการเชื่อมต่อหมดเวลา ไปจนถึงปัญหาใบรับรอง SSL หน้านี้เป็นคู่มืออ้างอิงฉบับสมบูรณ์ของรหัสข้อผิดพลาด curl ที่พบบ่อยที่สุด พร้อมคำอธิบาย สาเหตุ และวิธีแก้ไข หากคุณกำลังทำงานกับคำสั่ง curl ในโค้ดของคุณ ให้วางลงใน curl2code เพื่อแปลงเป็นภาษาโปรแกรมที่คุณต้องการ
ตารางอ้างอิงด่วน
สำเร็จ การดำเนินการเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาดใด ๆ
โปรโตคอลไม่รองรับ URL ใช้โปรโตคอลที่ curl ไม่ได้คอมไพล์มาเพื่อรองรับ
URL ผิดรูปแบบ ไวยากรณ์ URL ไม่ถูกต้องหรือไม่สามารถแยกวิเคราะห์ได้
ไม่สามารถแก้ไขพร็อกซีได้ ไม่สามารถแก้ไขชื่อโฮสต์ของพร็อกซีที่ระบุ
การค้นหา DNS ล้มเหลว — ไม่สามารถแก้ไขชื่อโฮสต์เป็น IP address ได้
การเชื่อมต่อ TCP ล้มเหลว — เซิร์ฟเวอร์ไม่ทำงาน พอร์ตถูกบล็อก หรือไฟร์วอลล์ปฏิเสธการเชื่อมต่อ
ไฟล์ไม่สมบูรณ์ การถ่ายโอนถูกขัดจังหวะและได้รับเพียงบางส่วนของไฟล์
เซิร์ฟเวอร์ส่งคืน HTTP error (4xx/5xx) และใช้แฟล็ก --fail
ข้อผิดพลาดในการเขียน curl ล้มเหลวในการเขียนข้อมูลที่ได้รับลงดิสก์ (สิทธิ์ถูกปฏิเสธหรือดิสก์เต็ม)
การดำเนินการเกินเวลาที่อนุญาตสูงสุด (DNS, เชื่อมต่อ หรือถ่ายโอน)
SSL/TLS handshake ล้มเหลว — เวอร์ชันโปรโตคอลหรือ cipher suite ไม่ตรงกัน
ไม่สามารถอ่านไฟล์ ไม่สามารถเปิดหรืออ่านไฟล์ในเครื่องที่อ้างอิงในคำขอ
เซิร์ฟเวอร์ตอบกลับว่างเปล่า เซิร์ฟเวอร์ปิดการเชื่อมต่อโดยไม่ส่งข้อมูลใด ๆ
การเชื่อมต่อถูกรีเซ็ต — เซิร์ฟเวอร์ดรอปการเชื่อมต่อระหว่างการถ่ายโอนข้อมูล
การตรวจสอบใบรับรอง SSL ล้มเหลว — หมดอายุ เซ็นเอง หรือชุด CA ล้าสมัย
ปัญหาใบรับรอง SSL CA ไม่สามารถอ่านหรือแยกวิเคราะห์ไฟล์ใบรับรอง CA ที่ระบุได้
ข้อผิดพลาดสตรีม HTTP/2 เกิดข้อผิดพลาดสตรีมระดับโปรโตคอล HTTP/2 ระหว่างการถ่ายโอน
ข้อผิดพลาด 6: ไม่สามารถแก้ไขชื่อโฮสต์ได้
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (6) Could not resolve hostcurl ไม่สามารถแก้ไขชื่อโฮสต์เป็น IP address ได้ — การค้นหา DNS ล้มเหลวก่อนที่จะมีการพยายามเชื่อมต่อ - สาเหตุ
- สาเหตุที่พบบ่อยที่สุดคือ: พิมพ์ชื่อโฮสต์ผิด (เช่น
curl https://apiexample.comแทนที่จะเป็นapi.example.com), ปัญหาเซิร์ฟเวอร์ DNS (DNS ที่กำหนดค่าไว้ไม่ทำงานหรือเข้าถึงไม่ได้), ไม่มีการเชื่อมต่อเครือข่าย (Wi-Fi ถูกตัด, VPN ไม่ได้เชื่อมต่อ) หรือโดเมนไม่มีอยู่จริง - วิธีแก้ไข
- ก่อนอื่น ตรวจสอบว่า URL ถูกต้อง จากนั้นทดสอบการแก้ไข DNS โดยตรง:
nslookup api.example.comหรือdig api.example.comหาก DNS ล้มเหลว ลองใช้เซิร์ฟเวอร์ DNS อื่น:curl --dns-servers 8.8.8.8 https://api.example.comตรวจสอบ/etc/resolv.confหรือการตั้งค่าเครือข่าย หากอยู่หลัง VPN ขององค์กร ตรวจสอบให้แน่ใจว่า DNS ภายในสามารถแก้ไขชื่อโฮสต์ได้
$ curl https://api.exmple.com/usersข้อผิดพลาด 7: เชื่อมต่อล้มเหลว
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (7) Failed to connect to host port: Connection refusedcurl แก้ไขชื่อโฮสต์ได้แล้ว แต่ไม่สามารถสร้างการเชื่อมต่อ TCP กับเซิร์ฟเวอร์ได้ — การเชื่อมต่อถูกปฏิเสธหรือหมดเวลาในระดับ TCP - สาเหตุ
- สาเหตุที่พบบ่อย ได้แก่: เซิร์ฟเวอร์ไม่ทำงานหรือไม่ได้รัน, ไฟร์วอลล์บล็อกพอร์ต (ตรวจสอบทั้งไฟร์วอลล์ฝั่งโลคอลและเซิร์ฟเวอร์), พอร์ตผิด (เช่น บริการทำงานบน 8080 แต่คุณเชื่อมต่อไปที่ 443) หรือ listen backlog ของเซิร์ฟเวอร์เต็มภายใต้โหลดสูง
- วิธีแก้ไข
- ตรวจสอบว่าเซิร์ฟเวอร์ทำงานอยู่:
ping api.example.comและtelnet api.example.com 443ตรวจสอบว่าพอร์ตที่ถูกต้องเปิดอยู่:nmap -p 443 api.example.comปิดไฟร์วอลล์ชั่วคราวเพื่อทดสอบ หากใช้ Docker ตรวจสอบว่าพอร์ตของคอนเทนเนอร์ถูกเผยแพร่ ลองใช้โหมด verbose:curl -v https://api.example.comเพื่อดูว่าการเชื่อมต่อล้มเหลวตรงไหน
$ curl https://localhost:8080/apiข้อผิดพลาด 22: HTTP ส่งคืนข้อผิดพลาด
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (22) The requested URL returned errorเซิร์ฟเวอร์ส่งคืนรหัสสถานะ HTTP ที่เป็นข้อผิดพลาด (4xx หรือ 5xx) และ curl ถูกเรียกด้วย-fหรือ--failซึ่งบอก curl ให้ถือว่า HTTP error เป็นความล้มเหลว - สาเหตุ
- ข้อผิดพลาดนี้เกิดจากรหัสสถานะ HTTP เช่น 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) หรือ 500 (Internal Server Error) — แต่เฉพาะเมื่อใช้
--failเท่านั้น หากไม่ใช้--fail, curl จะออกด้วยรหัส 0 แม้จะมี HTTP error สาเหตุที่พบบ่อย: URL ผิด, ขาดการยืนยันตัวตน, สิทธิ์ไม่เพียงพอ หรือบั๊กฝั่งเซิร์ฟเวอร์ - วิธีแก้ไข
- รัน curl โดยไม่ใช้
--failเพื่อดูเนื้อหาตอบกลับทั้งหมด — มักจะมีข้อความข้อผิดพลาดจริง ตรวจสอบรหัสสถานะ HTTP:curl -w "%{http_code}" -o /dev/null -s URLสำหรับ 401/403: ตรวจสอบ auth token หรือ API key สำหรับ 404: ตรวจสอบเส้นทาง URL อีกครั้ง สำหรับ 500: ปัญหาอยู่ฝั่งเซิร์ฟเวอร์
$ curl --fail https://api.example.com/nonexistentข้อผิดพลาด 28: หมดเวลาดำเนินการ
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (28) Operation timed outหรือcurl: (28) Connection timed outการดำเนินการใช้เวลานานกว่าเวลาที่อนุญาต นี่คือข้อผิดพลาด curl ที่พบบ่อยที่สุด — สามารถเกิดขึ้นระหว่างการแก้ไข DNS, การเชื่อมต่อ TCP, SSL handshake หรือการถ่ายโอนข้อมูล - สาเหตุ
- สาเหตุที่พบบ่อย ได้แก่: เซิร์ฟเวอร์ช้าหรือมีโหลดสูงไม่ตอบสนองทันเวลา, ความแออัดของเครือข่ายหรือ packet loss, ไฟร์วอลล์ดรอปแพ็กเก็ตอย่างเงียบ ๆ (ไม่มีการปฏิเสธ เงียบไปเลย), ค่าหมดเวลาที่เข้มงวดเกินไปที่ตั้งไว้ด้วย
--connect-timeoutหรือ--max-timeหรือการกำหนดค่าพร็อกซีผิดที่ทำให้เกิดความล่าช้า - วิธีแก้ไข
- เพิ่มเวลาหมดเวลา:
curl --connect-timeout 30 --max-time 120 URLใช้โหมด verbose เพื่อดูว่าค้างตรงไหน:curl -v URLทดสอบความหน่วงของเครือข่าย:ping api.example.comและtraceroute api.example.comหากอยู่หลังพร็อกซี ลองข้ามมัน:curl --noproxy '*' URLสำหรับการถ่ายโอนไฟล์ขนาดใหญ่ พิจารณาใช้--retry 3กับ--retry-delay 5
$ curl --connect-timeout 5 https://slow-api.example.com/dataข้อผิดพลาด 35: SSL Connect Error
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (35) SSL connect errorSSL/TLS handshake ล้มเหลว — curl ไม่สามารถสร้างการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ - สาเหตุ
- สาเหตุที่พบบ่อย: เวอร์ชัน TLS ไม่ตรงกัน (เซิร์ฟเวอร์ต้องการ TLS 1.3 แต่ curl ของคุณรองรับถึงแค่ TLS 1.2), cipher suite ไม่เข้ากัน, การกำหนดค่า SSL ของเซิร์ฟเวอร์ผิดพลาด (ใบรับรองหมดอายุในระหว่าง handshake, chain ไม่ครบ), เซิร์ฟเวอร์ไม่รองรับ HTTPS จริง ๆบนพอร์ตนั้น หรือพร็อกซีหรือไฟร์วอลล์สกัดกั้นการเชื่อมต่อ SSL (MITM)
- วิธีแก้ไข
- บังคับเวอร์ชัน TLS:
curl --tlsv1.2 URLหรือcurl --tlsv1.3 URLตรวจสอบว่าเซิร์ฟเวอร์รองรับอะไร:openssl s_client -connect api.example.com:443อัปเดต curl และ OpenSSL เป็นเวอร์ชันล่าสุด หากเซิร์ฟเวอร์ใช้ใบรับรองที่เซ็นเอง นี่มักเป็น error 60 แทน — error 35 มักบ่งบอกว่า handshake ล้มเหลวในระดับโปรโตคอล
$ curl https://legacy-server.example.com/apiข้อผิดพลาด 56: รับข้อมูลล้มเหลว — การเชื่อมต่อถูกรีเซ็ต
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (56) Recv failure: Connection reset by peerการเชื่อมต่อถูกสร้างสำเร็จแล้ว แต่การรับข้อมูลล้มเหลว — เซิร์ฟเวอร์ปิดหรือรีเซ็ตการเชื่อมต่ออย่างไม่คาดคิดระหว่างการถ่ายโอน - สาเหตุ
- มักเกิดขึ้นเมื่อ: เซิร์ฟเวอร์ล่มหรือรีสตาร์ทระหว่างการถ่ายโอน, โหลดบาลานเซอร์หรือพร็อกซีดรอปการเชื่อมต่อ (idle timeout, คำขอใหญ่เกินไป), ไฟร์วอลล์ตัดการเชื่อมต่อระยะยาว, เซิร์ฟเวอร์มี keep-alive timeout สั้นกว่าที่คาดไว้ หรือมีการหยุดชะงักของเครือข่ายระหว่างไคลเอนต์และเซิร์ฟเวอร์
- วิธีแก้ไข
- ลองส่งคำขออีกครั้ง — ปัญหาเครือข่ายชั่วคราวเป็นสาเหตุที่พบบ่อยที่สุด ใช้โหมด verbose:
curl -v URLเพื่อดูจุดที่ล้มเหลว หากข้อผิดพลาดเกิดขึ้นระหว่างการอัปโหลดขนาดใหญ่ ลอง chunked transfer:curl -H "Transfer-Encoding: chunked" URLสำหรับการดำเนินการ Git ที่แสดงRPC failed; curl 56ให้เพิ่ม buffer:git config http.postBuffer 524288000
$ curl https://api.example.com/large-downloadข้อผิดพลาด 60: ปัญหาใบรับรอง SSL
- ความหมาย
- เทอร์มินัลของคุณแสดง
curl: (60) SSL certificate problem: unable to get local issuer certificatecurl ไม่สามารถตรวจสอบใบรับรอง SSL ของเซิร์ฟเวอร์กับชุด CA (Certificate Authority) ได้ TLS handshake เสร็จสมบูรณ์ในระดับโปรโตคอล แต่การตรวจสอบใบรับรองล้มเหลว - สาเหตุ
- สาเหตุที่พบบ่อยที่สุด: เซิร์ฟเวอร์ใช้ใบรับรองที่เซ็นเอง, ใบรับรองหมดอายุ, certificate chain ไม่ครบ (ขาดใบรับรองกลาง), ชุด CA ของ curl ล้าสมัย (พบบ่อยในระบบเก่าหรือใน Docker container) หรือ Common Name / SAN ของใบรับรองไม่ตรงกับชื่อโฮสต์ที่ร้องขอ
- วิธีแก้ไข
- อัปเดตชุด CA:
curl --cacert /path/to/cacert.pem URLดาวน์โหลดชุดที่อัปเดตจาก https://curl.se/ca/cacert.pem เพื่อวินิจฉัย:openssl s_client -connect api.example.com:443 -showcertsสำหรับใบรับรองที่เซ็นเองในการพัฒนา ใช้curl -k URL(อย่าใช้ในโปรดักชัน — มันปิดการตรวจสอบใบรับรองทั้งหมด) ใน Docker ให้ติดตั้งแพ็กเกจca-certificates
$ curl https://self-signed.example.com/apiรหัสข้อผิดพลาดอื่น ๆ
สำเร็จ การดำเนินการเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาดใด ๆ
โปรโตคอลไม่รองรับ URL ใช้โปรโตคอลที่ curl ไม่ได้คอมไพล์มาเพื่อรองรับ
URL ผิดรูปแบบ ไวยากรณ์ URL ไม่ถูกต้องหรือไม่สามารถแยกวิเคราะห์ได้
ไม่สามารถแก้ไขพร็อกซีได้ ไม่สามารถแก้ไขชื่อโฮสต์ของพร็อกซีที่ระบุ
ไฟล์ไม่สมบูรณ์ การถ่ายโอนถูกขัดจังหวะและได้รับเพียงบางส่วนของไฟล์
ข้อผิดพลาดในการเขียน curl ล้มเหลวในการเขียนข้อมูลที่ได้รับลงดิสก์ (สิทธิ์ถูกปฏิเสธหรือดิสก์เต็ม)
ไม่สามารถอ่านไฟล์ ไม่สามารถเปิดหรืออ่านไฟล์ในเครื่องที่อ้างอิงในคำขอ
เซิร์ฟเวอร์ตอบกลับว่างเปล่า เซิร์ฟเวอร์ปิดการเชื่อมต่อโดยไม่ส่งข้อมูลใด ๆ
ปัญหาใบรับรอง SSL CA ไม่สามารถอ่านหรือแยกวิเคราะห์ไฟล์ใบรับรอง CA ที่ระบุได้
ข้อผิดพลาดสตรีม HTTP/2 เกิดข้อผิดพลาดสตรีมระดับโปรโตคอล HTTP/2 ระหว่างการถ่ายโอน
วิธีดีบักข้อผิดพลาด curl
เมื่อ curl ล้มเหลว แฟล็กสามตัวนี้จะช่วยให้คุณระบุสาเหตุได้อย่างรวดเร็ว — ตั้งแต่การแก้ไข DNS ไปจนถึง SSL handshake จนถึงข้อมูลตอบกลับ
- 1
เปิดใช้งาน verbose output
รัน
curl -v URLเพื่อดูวงจรคำขอ/ตอบกลับทั้งหมด: การแก้ไข DNS, การเชื่อมต่อ TCP, TLS handshake, header คำขอที่ส่ง และ header ตอบกลับที่ได้รับ นี่คือแฟล็กดีบักที่มีประโยชน์ที่สุด - 2
ตรวจสอบรหัสสถานะ HTTP
รัน
curl -o /dev/null -s -w "%{http_code}" URLเพื่อรับเฉพาะรหัสสถานะ HTTP (200, 404, 500 ฯลฯ) โดยไม่มีเนื้อหาตอบกลับ มีประโยชน์สำหรับตรวจสอบสถานะอย่างรวดเร็วและการเขียนสคริปต์ - 3
แสดงข้อผิดพลาดแบบเงียบ
รัน
curl -sS URLเพื่อซ่อนแถบความคืบหน้า (-s) แต่ยังคงแสดงข้อผิดพลาด (-S) เหมาะสำหรับสคริปต์ที่คุณต้องการผลลัพธ์ที่สะอาดแต่ต้องจับข้อผิดพลาด
คำถามที่พบบ่อย
ตรวจสอบรหัสออกของ curl ได้อย่างไร?
หลังจากรันคำสั่ง curl รหัสออกจะถูกเก็บไว้ในตัวแปรพิเศษของเชลล์ ใน Bash/Zsh ให้รัน echo $? ทันทีหลังคำสั่ง curl ใน PowerShell ใช้ $LASTEXITCODE ในสคริปต์ คุณสามารถตรวจสอบด้วยเงื่อนไข: if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi รหัสออก 0 หมายถึงสำเร็จ; หมายเลขอื่นใดบ่งบอกข้อผิดพลาด เพื่อดูทั้งรหัสสถานะ HTTP และรหัสออกของ curl ให้รวม curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?" โปรดทราบว่ารหัสออกของ curl แตกต่างจากรหัสสถานะ HTTP — curl คืนค่า 0 แม้จะได้ HTTP 404 เว้นแต่จะใช้แฟล็ก --fail
แก้ไข curl error 28 (operation timed out) ได้อย่างไร?
Error 28 หมายความว่าคำขอเกินเวลาที่อนุญาตสูงสุด ก่อนอื่น เพิ่มเวลาหมดเวลา: curl --connect-timeout 30 --max-time 120 URL --connect-timeout จำกัดเฟสการเชื่อมต่อ TCP ขณะที่ --max-time จำกัดการดำเนินการทั้งหมด จากนั้น วินิจฉัยคอขวดด้วย curl -v URL — ผลลัพธ์ verbose จะแสดงว่า curl ค้างตรงไหน (DNS, เชื่อมต่อ, TLS หรือถ่ายโอน) วิธีแก้ไขที่พบบ่อย: ตรวจสอบการเชื่อมต่อเครือข่ายและการตั้งค่า DNS ตรวจสอบว่าเซิร์ฟเวอร์ตอบสนอง (ping และ telnet) ข้ามพร็อกซีด้วย --noproxy '*' และสำหรับการดาวน์โหลดขนาดใหญ่ ให้เพิ่ม --retry 3 --retry-delay 5 สำหรับการลองใหม่อัตโนมัติ
แก้ไขข้อผิดพลาดใบรับรอง SSL ของ curl (error 60) ได้อย่างไร?
Error 60 หมายความว่า curl ไม่สามารถตรวจสอบใบรับรอง SSL ของเซิร์ฟเวอร์ได้ วิธีแก้ไขขึ้นอยู่กับสาเหตุ สำหรับชุด CA ที่ล้าสมัย: ดาวน์โหลดชุดใหม่จาก https://curl.se/ca/cacert.pem และใช้ curl --cacert /path/to/cacert.pem URL สำหรับ Docker container: ติดตั้งแพ็กเกจ ca-certificates (apt-get install ca-certificates) สำหรับใบรับรองที่เซ็นเองในการพัฒนา: ใช้ curl -k URL เพื่อข้ามการตรวจสอบ — แต่อย่าใช้ -k ในโปรดักชันเพราะมันปิดการตรวจสอบใบรับรองทั้งหมด เพื่อวินิจฉัย: รัน openssl s_client -connect host:443 -showcerts เพื่อตรวจสอบ certificate chain หากใบรับรองหมดอายุหรือชื่อโฮสต์ไม่ตรง ปัญหาอยู่ฝั่งเซิร์ฟเวอร์
curl error 7 (failed to connect) หมายความว่าอะไร?
Error 7 หมายความว่า curl แก้ไขชื่อโฮสต์เป็น IP address ได้แล้ว แต่ไม่สามารถสร้างการเชื่อมต่อ TCP ได้ เซิร์ฟเวอร์ปฏิเสธการเชื่อมต่ออย่างชัดเจน หรือการพยายามเชื่อมต่อหมดเวลาในระดับเครือข่าย สาเหตุที่พบบ่อย: บริการไม่ได้ทำงานบนโฮสต์ปลายทาง (ตรวจสอบด้วย systemctl status หรือ docker ps), ไฟร์วอลล์บล็อกพอร์ต (ทดสอบด้วย telnet host port), คุณใช้พอร์ตผิด (เช่น 80 แทน 443 หรือ 8080 สำหรับ dev server) หรือ listen backlog ของเซิร์ฟเวอร์เต็มภายใต้โหลดสูง เพื่อดีบัก: ใช้ curl -v URL และมองหา "Connected to" หรือ "Connection refused" ในผลลัพธ์