أكواد خطأ curl: المرجع الكامل

عندما يفشل أمر curl، فإنه يعيد كود خروج رقمي (يسمى أيضاً كود خطأ curl) يحدد نوع الخطأ. يمكنك التحقق من كود خروج curl عن طريق تشغيل echo $? مباشرة بعد أمر curl (أو $LASTEXITCODE في PowerShell). كود الخروج 0 يعني النجاح؛ أي رقم آخر يشير إلى مشكلة محددة — من فشل تحليل DNS ومهلات الاتصال إلى مشكلات شهادة SSL. هذه الصفحة هي مرجع كامل لأكثر أكواد خطأ curl شيوعاً مع التفسيرات والأسباب والحلول. إذا كنت تعمل مع أوامر curl في كودك، فقم بلصقها في curl2code لتحويلها إلى لغة البرمجة التي تختارها.

جدول مرجعي سريع

0CURLE_OK

نجاح. اكتملت العملية بدون أي أخطاء.

1CURLE_UNSUPPORTED_PROTOCOL

بروتوكول غير مدعوم. يستخدم الرابط (URL) بروتوكولاً لم يتم بناء curl مع دعم له.

3CURLE_URL_MALFORMAT

رابط (URL) غير صحيح. صيغة الرابط غير صالحة أو تعذر تحليلها.

5CURLE_COULDNT_RESOLVE_PROXY

تعذر تحليل البروكسي. تعذر تحليل اسم مضيف البروكسي المحدد.

6CURLE_COULDNT_RESOLVE_HOST

فشل بحث DNS — تعذر تحليل اسم المضيف إلى عنوان IP.

7CURLE_COULDNT_CONNECT

فشل اتصال TCP — الخادم معطل، المنفذ محظور، أو جدار الحماية يرفض الاتصالات.

18CURLE_PARTIAL_FILE

ملف جزئي. تم قطع النقل وتم استلام جزء فقط من الملف.

22CURLE_HTTP_RETURNED_ERROR

أعاد الخادم خطأ HTTP (4xx/5xx) وتم استخدام علم --fail.

23CURLE_WRITE_ERROR

خطأ في الكتابة. فشل curl في كتابة البيانات المستلمة على القرص (تم رفض الإذن أو القرص ممتلئ).

28CURLE_OPERATION_TIMEDOUT

تجاوزت العملية الحد الأقصى للوقت المسموح به (DNS، الاتصال، أو النقل).

35CURLE_SSL_CONNECT_ERROR

فشلت مصافحة SSL/TLS — عدم تطابق إصدار البروتوكول أو مجموعة التشفير.

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 — فشل بحث 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، فتأكد من نشر منفذ الحاوية. جرب الوضع التفصيلي: 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 كإخفاقات.
الأسباب
يتم إطلاق الخطأ بواسطة أكواد حالة HTTP مثل 400 (Bad Request)، 401 (Unauthorized)، 403 (Forbidden)، 404 (Not Found)، أو 500 (Internal Server Error) — ولكن فقط عند استخدام --fail. بدون --fail، يخرج curl بالكود 0 حتى في حالة أخطاء HTTP. الأسباب الشائعة: رابط خاطئ، فقدان المصادقة، أذونات غير كافية، أو أخطاء في جانب الخادم.
كيفية الإصلاح
قم بتشغيل curl بدون --fail لرؤية جسم الاستجابة الكامل — غالباً ما يحتوي على رسالة الخطأ الفعلية. تحقق من كود حالة HTTP: curl -w "%{http_code}" -o /dev/null -s URL. بالنسبة لـ 401/403: تحقق من رمز المصادقة (auth token) أو مفتاح API. بالنسبة لـ 404: تحقق جيداً من مسار الرابط. بالنسبة لـ 500: المشكلة من جانب الخادم.
$ curl --fail https://api.example.com/nonexistent

الخطأ 28: انتهت مهلة العملية

ماذا يعني
تظهر الطرفية الخاصة بك curl: (28) Operation timed out أو curl: (28) Connection timed out. استغرقت العملية وقتاً أطول من الوقت المسموح به. هذا هو خطأ curl الأكثر شيوعاً — يمكن أن يحدث أثناء تحليل DNS، أو اتصال TCP، أو مصافحة SSL، أو نقل البيانات.
الأسباب
تشمل الأسباب النموذجية: خادم بطيء أو مثقل لا يستجيب في الوقت المناسب، ازدحام الشبكة أو فقدان الحزم، جدار حماية يسقط الحزم بصمت (لا يوجد رفض، فقط صمت)، قيم مهلة صارمة للغاية تم تعيينها باستخدام --connect-timeout أو --max-time، أو تكوين خاطئ للبروكسي يسبب تأخيرات.
كيفية الإصلاح
قم بزيادة المهلة: curl --connect-timeout 30 --max-time 120 URL. استخدم الوضع التفصيلي لمعرفة مكان التوقف: 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

ماذا يعني
تظهر الطرفية الخاصة بك curl: (35) SSL connect error. فشلت مصافحة SSL/TLS — لم يتمكن curl من إنشاء اتصال آمن مع الخادم.
الأسباب
الأسباب الشائعة: عدم تطابق إصدار TLS (يتطلب الخادم TLS 1.3 ولكن curl لديك يدعم فقط حتى TLS 1.2)، عدم توافق مجموعة التشفير (cipher suite)، تكوين خاطئ لـ SSL في الخادم (تقديم شهادة منتهية الصلاحية أثناء المصافحة، سلسلة غير مكتملة)، الخادم لا يدعم HTTPS فعلياً على المنفذ المحدد، أو بروكسي أو جدار حماية يعترض اتصال SSL (MITM).
كيفية الإصلاح
فرض إصدار TLS محدد: curl --tlsv1.2 URL أو curl --tlsv1.3 URL. تحقق مما يدعمه الخادم: openssl s_client -connect api.example.com:443. قم بتحديث curl و OpenSSL إلى أحدث الإصدارات. إذا كان الخادم يستخدم شهادة موقعة ذاتياً، فعادة ما يكون هذا هو الخطأ 60 بدلاً من ذلك — يشير الخطأ 35 عادةً إلى فشل المصافحة على مستوى البروتوكول.
$ curl https://legacy-server.example.com/api

الخطأ 56: فشل الاستلام — تمت إعادة تعيين الاتصال

ماذا يعني
تظهر الطرفية الخاصة بك curl: (56) Recv failure: Connection reset by peer. تم إنشاء الاتصال بنجاح، ولكن فشل استلام البيانات — أغلق الخادم الاتصال أو أعاد تعيينه بشكل غير متوقع أثناء النقل.
الأسباب
يحدث هذا غالباً عندما: يتعطل الخادم أو يعاد تشغيله في منتصف النقل، موازن تحميل أو بروكسي يسقط الاتصال (مهلة الخمول، الطلب كبير جداً)، جدار حماية ينهي الاتصالات طويلة الأمد، الخادم لديه مهلة بقاء (keep-alive) أقصر مما هو متوقع، أو هناك انقطاع في الشبكة بين العميل والخادم.
كيفية الإصلاح
حاول تنفيذ الطلب مرة أخرى — مشكلات الشبكة العابرة هي السبب الأكثر شيوعاً. استخدم الوضع التفصيلي: curl -v URL لرؤية نقطة الفشل بالضبط. إذا حدث الخطأ أثناء عمليات رفع كبيرة، جرب النقل المجزأ (chunked transfer): curl -H "Transfer-Encoding: chunked" URL. لعمليات Git التي تظهر RPC failed; curl 56، قم بزيادة المخزن المؤقت: 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 (سلطة الشهادات) الخاصة به. اكتملت مصافحة TLS على مستوى البروتوكول، ولكن فشل التحقق من الشهادة.
الأسباب
الأسباب الأكثر شيوعاً: يستخدم الخادم شهادة موقعة ذاتياً، الشهادة منتهية الصلاحية، سلسلة الشهادات غير مكتملة (فقدان الشهادات الوسيطة)، حزمة CA الخاصة بـ curl قديمة (شائع في الأنظمة القديمة أو في حاويات Docker)، أو أن الاسم الشائع (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) غير صحيح. صيغة الرابط غير صالحة أو تعذر تحليلها.

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 إلى حمولة الاستجابة.

  1. 1

    تمكين المخرجات التفصيلية

    قم بتشغيل curl -v URL لرؤية دورة الطلب/الاستجابة الكاملة: دقة DNS، اتصال TCP، مصافحة TLS، رؤوس الطلب المرسلة، ورؤوس الاستجابة المستلمة. هذا هو العلم الأكثر فائدة لتصحيح الأخطاء.

  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، يتم تخزين رمز الخروج في متغير خاص بالصدفة (shell). في 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 رقم 28 (انتهت مهلة العملية)؟

يعني الخطأ 28 أن الطلب تجاوز الحد الأقصى للوقت المسموح به. أولاً، قم بزيادة المهلة: curl --connect-timeout 30 --max-time 120 URL. يحد --connect-timeout من مرحلة اتصال TCP، بينما يحد --max-time من العملية بأكملها. بعد ذلك، قم بتشخيص عنق الزجاجة باستخدام curl -v URL — تظهر المخرجات التفصيلية بالضبط أين يتوقف curl (DNS، الاتصال، TLS، أو النقل). الإصلاحات الشائعة: تحقق من اتصال الشبكة وإعدادات DNS، وتأكد من استجابة الخادم (ping و telnet)، وتجاوز الوكلاء باستخدام --noproxy '*'، وللتنزيلات الكبيرة أضف --retry 3 --retry-delay 5 لإعادة المحاولة التلقائية.

كيفية إصلاح أخطاء شهادة SSL في curl (الخطأ 60)؟

يعني الخطأ 60 أن curl لا يمكنه التحقق من شهادة SSL الخاصة بالخادم. يعتمد الإصلاح على السبب. بالنسبة لـ حزمة CA قديمة: قم بتنزيل حزمة جديدة من https://curl.se/ca/cacert.pem واستخدم curl --cacert /path/to/cacert.pem URL. بالنسبة لـ حاويات Docker: قم بتثبيت حزمة ca-certificates (apt-get install ca-certificates). بالنسبة لـ الشهادات الموقعة ذاتياً في بيئة التطوير: استخدم curl -k URL لتخطي التحقق — ولكن لا تستخدم -k أبداً في بيئة الإنتاج لأنه يعطل جميع عمليات التحقق من الشهادات. للتشخيص: قم بتشغيل openssl s_client -connect host:443 -showcerts لفحص سلسلة الشهادات. إذا انتهت صلاحية الشهادة أو لم يتطابق اسم المضيف، فإن المشكلة تكمن في جانب الخادم.

ماذا يعني خطأ curl رقم 7 (فشل الاتصال)؟

يعني الخطأ 7 أن curl قام بتحليل اسم المضيف إلى عنوان IP ولكنه لم يتمكن من إنشاء اتصال TCP. لقد رفض الخادم الاتصال بنشاط أو انتهت مهلة محاولة الاتصال على مستوى الشبكة. الأسباب الشائعة: الخدمة لا تعمل على المضيف المستهدف (تحقق باستخدام systemctl status أو docker ps)، أو جدار حماية يحظر المنفذ (اختبر باستخدام telnet host port)، أو أنك تستخدم منفذاً خاطئاً (على سبيل المثال، 80 بدلاً من 443، أو 8080 لخادم تطوير)، أو أن سجل الاستماع (backlog) للخادم ممتلئ تحت الحمل الثقيل. لتصحيح الأخطاء: استخدم curl -v URL وابحث عن "Connected to" أو "Connection refused" في المخرجات.