รหัสข้อผิดพลาด curl: คู่มืออ้างอิงฉบับสมบูรณ์

เมื่อคำสั่ง curl ล้มเหลว จะส่งคืนรหัสออก (exit code) เป็นตัวเลข (หรือเรียกว่ารหัสข้อผิดพลาด curl) ที่ระบุประเภทของข้อผิดพลาด คุณสามารถตรวจสอบรหัสออกของ curl โดยรัน echo $? ทันทีหลังคำสั่ง curl (หรือ $LASTEXITCODE ใน PowerShell) รหัสออก 0 หมายถึงสำเร็จ; หมายเลขอื่นใดบ่งบอกปัญหาเฉพาะ — ตั้งแต่การแก้ไข DNS ล้มเหลว และการเชื่อมต่อหมดเวลา ไปจนถึงปัญหาใบรับรอง SSL หน้านี้เป็นคู่มืออ้างอิงฉบับสมบูรณ์ของรหัสข้อผิดพลาด curl ที่พบบ่อยที่สุด พร้อมคำอธิบาย สาเหตุ และวิธีแก้ไข หากคุณกำลังทำงานกับคำสั่ง curl ในโค้ดของคุณ ให้วางลงใน curl2code เพื่อแปลงเป็นภาษาโปรแกรมที่คุณต้องการ

ตารางอ้างอิงด่วน

0CURLE_OK

สำเร็จ การดำเนินการเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาดใด ๆ

1CURLE_UNSUPPORTED_PROTOCOL

โปรโตคอลไม่รองรับ URL ใช้โปรโตคอลที่ curl ไม่ได้คอมไพล์มาเพื่อรองรับ

3CURLE_URL_MALFORMAT

URL ผิดรูปแบบ ไวยากรณ์ URL ไม่ถูกต้องหรือไม่สามารถแยกวิเคราะห์ได้

5CURLE_COULDNT_RESOLVE_PROXY

ไม่สามารถแก้ไขพร็อกซีได้ ไม่สามารถแก้ไขชื่อโฮสต์ของพร็อกซีที่ระบุ

6CURLE_COULDNT_RESOLVE_HOST

การค้นหา DNS ล้มเหลว — ไม่สามารถแก้ไขชื่อโฮสต์เป็น IP address ได้

7CURLE_COULDNT_CONNECT

การเชื่อมต่อ TCP ล้มเหลว — เซิร์ฟเวอร์ไม่ทำงาน พอร์ตถูกบล็อก หรือไฟร์วอลล์ปฏิเสธการเชื่อมต่อ

18CURLE_PARTIAL_FILE

ไฟล์ไม่สมบูรณ์ การถ่ายโอนถูกขัดจังหวะและได้รับเพียงบางส่วนของไฟล์

22CURLE_HTTP_RETURNED_ERROR

เซิร์ฟเวอร์ส่งคืน HTTP error (4xx/5xx) และใช้แฟล็ก --fail

23CURLE_WRITE_ERROR

ข้อผิดพลาดในการเขียน curl ล้มเหลวในการเขียนข้อมูลที่ได้รับลงดิสก์ (สิทธิ์ถูกปฏิเสธหรือดิสก์เต็ม)

28CURLE_OPERATION_TIMEDOUT

การดำเนินการเกินเวลาที่อนุญาตสูงสุด (DNS, เชื่อมต่อ หรือถ่ายโอน)

35CURLE_SSL_CONNECT_ERROR

SSL/TLS handshake ล้มเหลว — เวอร์ชันโปรโตคอลหรือ cipher suite ไม่ตรงกัน

37CURLE_FILE_COULDNT_READ_FILE

ไม่สามารถอ่านไฟล์ ไม่สามารถเปิดหรืออ่านไฟล์ในเครื่องที่อ้างอิงในคำขอ

52CURLE_GOT_NOTHING

เซิร์ฟเวอร์ตอบกลับว่างเปล่า เซิร์ฟเวอร์ปิดการเชื่อมต่อโดยไม่ส่งข้อมูลใด ๆ

56CURLE_RECV_ERROR

การเชื่อมต่อถูกรีเซ็ต — เซิร์ฟเวอร์ดรอปการเชื่อมต่อระหว่างการถ่ายโอนข้อมูล

60CURLE_SSL_CACERT

การตรวจสอบใบรับรอง SSL ล้มเหลว — หมดอายุ เซ็นเอง หรือชุด CA ล้าสมัย

77CURLE_SSL_CACERT_BADFILE

ปัญหาใบรับรอง SSL CA ไม่สามารถอ่านหรือแยกวิเคราะห์ไฟล์ใบรับรอง CA ที่ระบุได้

92CURLE_HTTP2_STREAM

ข้อผิดพลาดสตรีม HTTP/2 เกิดข้อผิดพลาดสตรีมระดับโปรโตคอล HTTP/2 ระหว่างการถ่ายโอน

ข้อผิดพลาด 6: ไม่สามารถแก้ไขชื่อโฮสต์ได้

ความหมาย
เทอร์มินัลของคุณแสดง curl: (6) Could not resolve host curl ไม่สามารถแก้ไขชื่อโฮสต์เป็น 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 refused curl แก้ไขชื่อโฮสต์ได้แล้ว แต่ไม่สามารถสร้างการเชื่อมต่อ 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 error SSL/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 certificate curl ไม่สามารถตรวจสอบใบรับรอง 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

รหัสข้อผิดพลาดอื่น ๆ

0CURLE_OK

สำเร็จ การดำเนินการเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาดใด ๆ

1CURLE_UNSUPPORTED_PROTOCOL

โปรโตคอลไม่รองรับ URL ใช้โปรโตคอลที่ curl ไม่ได้คอมไพล์มาเพื่อรองรับ

3CURLE_URL_MALFORMAT

URL ผิดรูปแบบ ไวยากรณ์ URL ไม่ถูกต้องหรือไม่สามารถแยกวิเคราะห์ได้

5CURLE_COULDNT_RESOLVE_PROXY

ไม่สามารถแก้ไขพร็อกซีได้ ไม่สามารถแก้ไขชื่อโฮสต์ของพร็อกซีที่ระบุ

18CURLE_PARTIAL_FILE

ไฟล์ไม่สมบูรณ์ การถ่ายโอนถูกขัดจังหวะและได้รับเพียงบางส่วนของไฟล์

23CURLE_WRITE_ERROR

ข้อผิดพลาดในการเขียน curl ล้มเหลวในการเขียนข้อมูลที่ได้รับลงดิสก์ (สิทธิ์ถูกปฏิเสธหรือดิสก์เต็ม)

37CURLE_FILE_COULDNT_READ_FILE

ไม่สามารถอ่านไฟล์ ไม่สามารถเปิดหรืออ่านไฟล์ในเครื่องที่อ้างอิงในคำขอ

52CURLE_GOT_NOTHING

เซิร์ฟเวอร์ตอบกลับว่างเปล่า เซิร์ฟเวอร์ปิดการเชื่อมต่อโดยไม่ส่งข้อมูลใด ๆ

77CURLE_SSL_CACERT_BADFILE

ปัญหาใบรับรอง SSL CA ไม่สามารถอ่านหรือแยกวิเคราะห์ไฟล์ใบรับรอง CA ที่ระบุได้

92CURLE_HTTP2_STREAM

ข้อผิดพลาดสตรีม HTTP/2 เกิดข้อผิดพลาดสตรีมระดับโปรโตคอล HTTP/2 ระหว่างการถ่ายโอน

วิธีดีบักข้อผิดพลาด curl

เมื่อ curl ล้มเหลว แฟล็กสามตัวนี้จะช่วยให้คุณระบุสาเหตุได้อย่างรวดเร็ว — ตั้งแต่การแก้ไข DNS ไปจนถึง SSL handshake จนถึงข้อมูลตอบกลับ

  1. 1

    เปิดใช้งาน verbose output

    รัน curl -v URL เพื่อดูวงจรคำขอ/ตอบกลับทั้งหมด: การแก้ไข DNS, การเชื่อมต่อ TCP, TLS handshake, header คำขอที่ส่ง และ header ตอบกลับที่ได้รับ นี่คือแฟล็กดีบักที่มีประโยชน์ที่สุด

  2. 2

    ตรวจสอบรหัสสถานะ HTTP

    รัน curl -o /dev/null -s -w "%{http_code}" URL เพื่อรับเฉพาะรหัสสถานะ HTTP (200, 404, 500 ฯลฯ) โดยไม่มีเนื้อหาตอบกลับ มีประโยชน์สำหรับตรวจสอบสถานะอย่างรวดเร็วและการเขียนสคริปต์

  3. 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" ในผลลัพธ์