کدهای خطای curl: مرجع کامل
وقتی یک دستور curl با شکست مواجه میشود، یک کد خروج عددی (که کد خطای curl نیز نامیده میشود) برمیگرداند که نوع خطا را مشخص میکند. میتوانید کد خروج curl را با اجرای echo $? بلافاصله پس از دستور curl بررسی کنید (یا $LASTEXITCODE در PowerShell). کد خروج 0 به معنای موفقیت است؛ هر عدد دیگری نشاندهنده یک مشکل خاص است — از شکست تفکیک DNS و تایماوت اتصال تا مشکلات گواهی SSL. این صفحه یک مرجع کامل از رایجترین کدهای خطای curl با توضیحات، دلایل و راهحلها است. اگر در کد خود با دستورات curl کار میکنید، آنها را در curl2code بچسبانید تا به زبان برنامهنویسی مورد نظرتان تبدیل شوند.
جدول مرجع سریع
موفقیت. عملیات بدون هیچ خطایی تکمیل شد.
پروتکل پشتیبانینشده. URL از پروتکلی استفاده میکند که curl برای پشتیبانی از آن ساخته نشده است.
URL نامعتبر. سینتکس URL نامعتبر است یا قابل تجزیه نیست.
تفکیک پروکسی ممکن نیست. نام میزبان پروکسی مشخصشده قابل تفکیک نبود.
جستجوی DNS شکست خورد — نام میزبان نتوانست به آدرس IP تفکیک شود.
اتصال TCP شکست خورد — سرور خاموش است، پورت مسدود است یا فایروال اتصالات را رد میکند.
فایل ناقص. انتقال قطع شد و فقط بخشی از فایل دریافت شد.
سرور خطای HTTP (4xx/5xx) برگرداند و فلگ --fail استفاده شده بود.
خطای نوشتن. curl نتوانست دادههای دریافتی را روی دیسک بنویسد (مجوز رد شد یا دیسک پر است).
عملیات از حداکثر زمان مجاز فراتر رفت (DNS، اتصال یا انتقال).
دستدهی SSL/TLS شکست خورد — عدم تطابق نسخه پروتکل یا مجموعه رمز.
خواندن فایل ممکن نیست. فایل محلی مرجع در درخواست قابل باز کردن یا خواندن نبود.
پاسخ خالی از سرور. سرور اتصال را بدون ارسال هیچ دادهای بست.
اتصال بازنشانی شد — سرور اتصال را در حین انتقال داده قطع کرد.
تأیید گواهی SSL شکست خورد — منقضی، خودامضا یا بسته CA قدیمی است.
مشکل گواهی CA SSL. فایل گواهی CA مشخصشده قابل خواندن یا تجزیه نبود.
خطای جریان 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 متصل میشوید)، یا صف انتظار سرور پر است تحت بار سنگین.
- نحوه رفع
- بررسی کنید که سرور در حال اجرا است:
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 را به عنوان شکست در نظر بگیرد. - دلایل
- این خطا توسط کدهای وضعیت HTTP مانند 400 (درخواست نامعتبر)، 401 (غیرمجاز)، 403 (ممنوع)، 404 (یافت نشد) یا 500 (خطای داخلی سرور) ایجاد میشود — اما فقط زمانی که
--failاستفاده شود. بدون--fail، curl حتی در خطاهای HTTP با کد 0 خارج میشود. دلایل رایج: URL اشتباه، عدم احراز هویت، مجوزهای ناکافی یا باگهای سمت سرور. - نحوه رفع
- curl را بدون
--failاجرا کنید تا بدنه کامل پاسخ را ببینید — اغلب حاوی پیام خطای واقعی است. کد وضعیت HTTP را بررسی کنید:curl -w "%{http_code}" -o /dev/null -s URL. برای 401/403: توکن احراز هویت یا کلید API خود را تأیید کنید. برای 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 یا انتقال داده رخ دهد. - دلایل
- دلایل معمول عبارتند از: سرور کند یا تحت بار سنگین که به موقع پاسخ نمیدهد، ازدحام شبکه یا از دست رفتن بستهها، فایروال بستهها را بیسر و صدا حذف میکند (بدون رد کردن، فقط سکوت)، مقادیر تایماوت بسیار سختگیرانه تنظیمشده با
--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
- معنی آن چیست
- ترمینال شما پیام
curl: (35) SSL connect errorرا نشان میدهد. دستدهی SSL/TLS شکست خورد — curl نتوانست یک اتصال امن با سرور برقرار کند. - دلایل
- دلایل رایج: عدم تطابق نسخه TLS (سرور نیاز به TLS 1.3 دارد اما curl شما فقط تا TLS 1.2 پشتیبانی میکند)، ناسازگاری مجموعه رمز، پیکربندی نادرست 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 کوتاهتر از حد انتظار است، یا یک اختلال شبکه بین کلاینت و سرور وجود دارد.
- نحوه رفع
- درخواست را دوباره امتحان کنید — مشکلات موقتی شبکه رایجترین دلیل هستند. از حالت verbose استفاده کنید:
curl -v URLتا نقطه دقیق شکست را ببینید. اگر خطا در حین آپلودهای بزرگ رخ میدهد، انتقال chunked را امتحان کنید: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سایر کدهای خطا
موفقیت. عملیات بدون هیچ خطایی تکمیل شد.
پروتکل پشتیبانینشده. URL از پروتکلی استفاده میکند که curl برای پشتیبانی از آن ساخته نشده است.
URL نامعتبر. سینتکس URL نامعتبر است یا قابل تجزیه نیست.
تفکیک پروکسی ممکن نیست. نام میزبان پروکسی مشخصشده قابل تفکیک نبود.
فایل ناقص. انتقال قطع شد و فقط بخشی از فایل دریافت شد.
خطای نوشتن. curl نتوانست دادههای دریافتی را روی دیسک بنویسد (مجوز رد شد یا دیسک پر است).
خواندن فایل ممکن نیست. فایل محلی مرجع در درخواست قابل باز کردن یا خواندن نبود.
پاسخ خالی از سرور. سرور اتصال را بدون ارسال هیچ دادهای بست.
مشکل گواهی CA SSL. فایل گواهی CA مشخصشده قابل خواندن یا تجزیه نبود.
خطای جریان HTTP/2. یک خطای سطح پروتکل جریان HTTP/2 در حین انتقال رخ داد.
نحوه اشکالزدایی خطاهای curl
وقتی curl شکست میخورد، این سه فلگ به شما کمک میکنند تا به سرعت علت اصلی را شناسایی کنید — از تفکیک DNS تا دستدهی SSL تا محتوای پاسخ.
- 1
فعالسازی خروجی verbose
دستور
curl -v URLرا اجرا کنید تا چرخه کامل درخواست/پاسخ را ببینید: تفکیک DNS، اتصال TCP، دستدهی TLS، هدرهای درخواست ارسالشده و هدرهای پاسخ دریافتشده. این مفیدترین فلگ اشکالزدایی است. - 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، بلافاصله پس از دستور curl دستور echo $? را اجرا کنید. در 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 حتی برای HTTP 404 کد 0 برمیگرداند مگر اینکه از فلگ --fail استفاده کنید.
چگونه خطای curl 28 (تایماوت عملیات) را رفع کنیم؟
خطای 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 (خطای 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 برای سرور توسعه)، یا صف انتظار سرور پر است تحت بار سنگین. برای اشکالزدایی: از curl -v URL استفاده کنید و در خروجی به دنبال «Connected to» یا «Connection refused» بگردید.