---
title: "استفاده از cURL با پروکسی: تنظیم پروکسی HTTP و SOCKS5"
description: "برای استفاده از cURL با پروکسی، گزینه ⁦-x http://user:pass@host:port⁩ را به دستور بیفزایید. SOCKS5، متغیرهای محیطی، ⁦.curlrc⁩ و رفع خطای 407 را هم شرح می‌دهیم."
url: https://proxynet.io/fa/blog/curl-proxy
date: 2023-08-08
updated: 2026-09-25
author: "PXNET"
category: "یکپارچه‌سازی, آموزش‌ها"
lang: fa
---

# استفاده از cURL با پروکسی: تنظیم پروکسی HTTP و SOCKS5

از ارائه‌دهنده پروکسی یک نشانی گرفته‌اید و می‌خواهید پیش از آنکه آن را در اسکرپر، یک cron job یا خط لوله CI بگذارید، بدانید کار می‌کند یا نه. سریع‌ترین راه بررسی cURL است: یک دستور درخواست را از طریق پروکسی می‌فرستد و آدرس IP را که سایت مقصد می‌بیند چاپ می‌کند، و همان دستور بعداً بدون تغییر در یک اسکریپت شل قرار می‌گیرد.

در این نوشته گزینه `-x`، نام کاربری و رمز، SOCKS5، تنظیم پروکسی برای همه دستورها، یک اسکریپت دانلود با تلاش دوباره و متن دقیق پیام‌های خطا را مرور می‌کنیم. همه دستورها با ⁦curl 8.21⁩ روی یک پروکسی آزمایشی محلی اجرا شده‌اند و گزینه‌ها در [راهنمای رسمی cURL](https://curl.se/docs/manpage.html) (man page) مستند شده‌اند.

> **نکته: پاسخ کوتاه**
>
> گزینه `-x` (شکل بلند آن `--proxy`) را همراه نشانی پروکسی به دستور اضافه کنید: `curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip`. طرح (scheme) ابتدای نشانی نوع پروکسی را تعیین می‌کند: `http://` برای پروکسی HTTP و `socks5h://` برای SOCKS5، که در آن نام میزبان را خود پروکسی به IP تبدیل می‌کند. `-x` فقط برای همان یک دستور معتبر است؛ برای همه دستورها متغیر محیطی `https_proxy` را تنظیم کنید یا سطر `proxy = "…"` را به `.curlrc` بیفزایید.

## cURL چیست؟

cURL (تلفظ: «کِرل») ابزاری خط فرمانی برای انتقال داده به سرورها و از سرورها با استفاده از URL است: صفحه و فایل دانلود می‌کند، فرم و درخواست API می‌فرستد و پاسخ را روی صفحه چاپ یا در فایل ذخیره می‌کند. کار اصلی را **libcurl** انجام می‌دهد؛ کتابخانه انتقال داده‌ای که PHP و زبان‌های دیگر هم از آن استفاده می‌کنند.

مثل هر دستور دیگری، cURL نحو ثابتی دارد:

```bash
curl [options] [URL]
```

بخش options تعیین می‌کند دستور چه کاری انجام دهد. از این پارامترها که به آن‌ها flag هم می‌گویند بیش از 250 تا وجود دارد. `-o page.html` پاسخ را در فایل ذخیره می‌کند، `-I` فقط هدرها را می‌گیرد، `-L` ریدایرکت‌ها را دنبال می‌کند و `-x` از پروکسی استفاده می‌کند. همه گزینه‌ها به بزرگی و کوچکی حرف حساس‌اند: `-x` پروکسی را تعیین می‌کند و `-X` متد HTTP را.

cURL روی macOS، روی ⁦Windows 10⁩ و 11 با نام `curl.exe` و روی بیشتر توزیع‌های Linux از پیش نصب است و روی همه این سیستم‌ها یکسان رفتار می‌کند. در ایمیج‌های کوچک کانتینر ممکن است نباشد و باید نصبش کنید (در Debian و Ubuntu با `apt install curl`). دستور `curl --version` را اجرا کنید: اگر در سطر `Features:` عبارت `HTTPS-proxy` دیده شود، نسخه شما می‌تواند از طریق TLS هم به پروکسی وصل شود.

## cURL چه پروتکل‌هایی را پشتیبانی می‌کند؟

cURL برای مبدأ یا مقصد به یک URL نیاز دارد؛ پروتکل‌های شبکه‌ای که با URL آدرس‌دهی نمی‌شوند با cURL کار نمی‌کنند. نسخه فعلی این پروتکل‌ها را فهرست می‌کند: DICT، FILE، FTP، FTPS، GOPHER، GOPHERS، HTTP، HTTPS، IMAP، IMAPS، LDAP، LDAPS، MQTT، MQTTS، POP3، POP3S، RTSP، SCP، SFTP، SMB، SMBS، SMTP، SMTPS، TELNET، TFTP، WS و WSS. دستور `curl --version` نشان می‌دهد نسخه شما کدام‌ها را پشتیبانی می‌کند؛ RTMP که در فهرست‌های قدیمی‌تر دیده می‌شود دیگر وجود ندارد.

اگر طرح نشانی را ننویسید، cURL پروتکل را از نام میزبان حدس می‌زند (`ftp.example.com` یعنی FTP و بیشتر نام‌ها یعنی HTTP). برای پروکسی این موضوع از یک جهت مهم است: پروکسی HTTP ترافیک HTTP و HTTPS را حمل می‌کند؛ پروتکل‌های دیگر فقط از راه تونل CONNECT (`-p`) عبور می‌کنند، آن هم به شرطی که پروکسی آن پورت را مجاز بداند. SOCKS5 هر اتصال TCP را جابه‌جا می‌کند، پس FTP یا SMTP از پشت پروکسی معمولاً یعنی SOCKS5.

## چرا cURL را با پروکسی به کار ببریم؟

- **مراحل قابل مشاهده.** با `-v` خروجی مفصلی از آنچه فرستاده و دریافت شده می‌گیرید: اتصال به پروکسی، درخواست CONNECT و هر دو پاسخ. برای عیب‌یابی بسیار به کار می‌آید، چون می‌بینید درخواست دقیقاً در کدام مرحله شکست می‌خورد.
- **همه انواع پروکسی با یک گزینه.** HTTP، HTTPS، SOCKS4، SOCKS4a، SOCKS5 و SOCKS5h همگی با `-x` تعریف می‌شوند.
- **مناسب اسکریپت.** کدهای خروج (exit code)، `--retry`، زمان‌های انتظار (timeout) و `--write-out` به اسکریپت شل امکان می‌دهند خطاها را مدیریت کند، و توابع `curl_*` در PHP همین گزینه‌ها را می‌پذیرند.
- **چند URL در یک دستور.** می‌توانید چند حالت از یک URL را با کروشه یا آکولاد در یک دستور بنویسید (URL globbing): `page[1-20].html` یا `{a,b,c}` به چند درخواست تبدیل می‌شود که همه از همان پروکسی می‌روند.

کاربردهای رایج: بررسی کشور IP خروجی پیش از اجرای [استخراج داده](/fa/data-scraping)، آزمودن مقصدهای [رصد قیمت](/fa/price-monitoring) از دید بازاری دیگر و دانلود در کارهای زمان‌بندی‌شده. معادل‌های Node.js را در [معادل cURL در JavaScript](/fa/blog/curl-in-javascript) و نمونه‌های PHP را در [وب اسکرپینگ با PHP](/fa/blog/php-web-scraping) آورده‌ایم.

## cURL چگونه درخواست را از طریق پروکسی می‌فرستد؟

1. **cURL به پروکسی وصل می‌شود**، نه به مقصد.
2. **مقصد HTTP، پروکسی HTTP:** cURL درخواست را با URL کامل می‌فرستد (`GET http://example.com/ HTTP/1.1`). پروکسی می‌تواند محتوای آن را بخواند.
3. **مقصد HTTPS، پروکسی HTTP:** cURL درخواست `CONNECT example.com:443` را می‌فرستد و اگر نام کاربری و رمز داده باشید، هدر `Proxy-Authorization` را هم همراهش می‌کند. پس از آنکه پروکسی با `200` پاسخ داد، اتصال TLS با مقصد درون همین تونل برقرار می‌شود و پروکسی فقط نام میزبان و پورت را می‌بیند. [متد CONNECT](https://www.rfc-editor.org/rfc/rfc9110.html#section-9.3.6) در ⁦RFC 9110⁩ تعریف شده است.
4. **پروکسی SOCKS5:** cURL وارد پروکسی می‌شود (با نام کاربری و رمز، اگر داده باشید) و از پروکسی می‌خواهد به مقصد وصل شود ([⁦RFC 1928⁩](https://www.rfc-editor.org/rfc/rfc1928.html)). با `socks5://` خودش نام میزبان را به IP تبدیل می‌کند و همان IP را می‌فرستد؛ با `socks5h://` خود نام میزبان را می‌فرستد.
5. **مقصد به IP پروکسی پاسخ می‌دهد.** IP شما به مقصد نمی‌رسد، اما اگر cURL نام‌ها را روی رایانه شما resolve کند، پرس‌وجوهای DNS از خط خود شما بیرون می‌روند.

## تنظیم پروکسی در cURL: گزینه `-x`

ترمینال را باز کنید و با `curl --help proxy` فهرست همه گزینه‌های مربوط به پروکسی را ببینید. مهم‌ترین سطر آن این است:

```text
 -x, --proxy <[protocol://]host[:port]>  Use this proxy
```

حرف `x` کوچک است. مشخصات پروکسی را با `-x` یا با `--proxy` می‌دهید؛ هر دو یک معنا دارند:

```bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip
```

نشانی `httpbin.org/ip` آدرس IP مبدأ درخواست را برمی‌گرداند: اگر پروکسی کار کند، IP خروجی پروکسی را می‌بینید نه آدرس خودتان.

- **بدون طرح یعنی HTTP.** پروتکل پیش‌فرض پروکسی HTTP است، بنابراین `-x "user:pass@pr.proxynet.io:8000"` دقیقاً مثل شکل `http://` رفتار می‌کند.
- **پورت را همیشه بنویسید.** بدون پورت، cURL یک پورت پیش‌فرض برمی‌دارد: در آزمایش ما با ⁦curl 8.21⁩ پورت 80 برای `http://`، پورت 443 برای `https://` و پورت 1080 برای SOCKS (راهنمای رسمی هنوز 1080 را ذکر می‌کند). هیچ‌کدام از این‌ها به احتمال زیاد پورت ارائه‌دهنده شما نیست، پس اتصال شکست می‌خورد یا به timeout می‌رسد.
- **نشانی را داخل گیومه دوتایی بگذارید** تا پوسته فرمان نویسه‌های ویژه‌ای مانند `&`، `?` یا `!` را تفسیر نکند.
- **`-x` فقط برای یک دستور است** و بر متغیرهای محیطی پروکسی مقدم است. دستور بعدی دوباره مستقیم بیرون می‌رود.

در محصولات مسکونی و موبایل Proxynet یک گیت‌وی هر دو پروتکل HTTP و SOCKS5 را روی پورت‌های جداگانه ارائه می‌دهد و بخش «Endpoint Generator» در پنل کاربری، نام کاربری را با کشور، شهر و نشستی که انتخاب می‌کنید می‌سازد.

## چگونه cURL را با پروکسی HTTP یا HTTPS به کار ببریم؟

پروکسی HTTP هر دو نوع مقصد را حمل می‌کند:

```bash
# HTTPS target: CONNECT tunnel, the page stays encrypted
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip

# HTTP target: the proxy forwards the plain request
curl -x "http://user:pass@pr.proxynet.io:8000" http://httpbin.org/ip
```

**پروکسی HTTPS** (`https://`) اتصال میان شما و خود پروکسی را هم رمزگذاری می‌کند. فقط وقتی از آن استفاده کنید که پورت پروکسی با TLS کار کند؛ `https://` روی یک پورت HTTP ساده در مرحله دست‌دهی (handshake) شکست می‌خورد (در Windows با پیام `SEC_E_INVALID_TOKEN` و با OpenSSL معمولاً با `wrong version number`).

گزینه‌های گواهی میان این دو اتصال تقسیم شده‌اند:

- `-k` (`--insecure`) بررسی گواهی را فقط برای سایت **مقصد** کنار می‌گذارد. با مقصد `http://` هیچ اثری ندارد.
- `--proxy-insecure` بررسی گواهی **پروکسی HTTPS** را کنار می‌گذارد. `--proxy-cacert file.pem` امن‌تر است: گواهی CA پروکسی سازمانی را معتبر می‌شمارد بی‌آنکه بررسی‌ها را خاموش کند.

`-k` را فقط برای آزمون‌های سریع نگه دارید و هرگز در اسکریپت‌هایی که توکن می‌فرستند به کار نبرید. برای پروتکل‌های غیر HTTP از پشت پروکسی HTTP، گزینه `-p` (`--proxytunnel`) را اضافه کنید. اینکه ترافیک رمزگذاری‌شده چگونه از پروکسی عبور می‌کند در صفحه [پروکسی HTTPS](https://proxynet.io/fa/https-proxy) آمده است.

## چگونه نام کاربری و رمز پروکسی را بدهیم؟

هر دو شکل همان هدر `Proxy-Authorization` را می‌فرستند:

```bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip
curl -x "http://pr.proxynet.io:8000" -U "user:pass" https://httpbin.org/ip
```

وقتی رمز داخل نشانی نوشته می‌شود، نویسه‌های ویژه آن باید با کدگذاری درصدی (percent-encoding) نوشته شوند: `@` به شکل `%40`، `:` به شکل `%3A` و `#` به شکل `%23`. cURL پیش از ارسال آن‌ها را به حالت اول برمی‌گرداند؛ در آزمایش ما `p%40ss` به شکل `p@ss` به پروکسی رسید. با `-U` (`--proxy-user`) کدگذاری لازم نیست. احراز هویت Basic پیش‌فرض است؛ پروکسی‌های سازمانی ممکن است `--proxy-ntlm`، `--proxy-digest` یا `--proxy-anyauth` لازم داشته باشند.

رمزی که در خط فرمان می‌نویسید در تاریخچه پوسته (shell history) ثبت می‌شود. در اسکریپت‌ها آن را از یک فایل پیکربندی خصوصی بخوانید (`-K file`) یا به‌جای رمز از لیست سفید IP استفاده کنید (Proxynet تا 10 IP را می‌پذیرد). در نوشته [احراز هویت پروکسی: نام کاربری و رمز یا لیست سفید IP](/fa/blog/proxy-authentication-methods) این دو روش را مقایسه کرده‌ایم و خطای 407 را هم توضیح داده‌ایم.

## چگونه cURL را با پروکسی SOCKS5 به کار ببریم؟

نسخه SOCKS را به‌عنوان طرح نشانی بنویسید:

```bash
curl -x "socks5h://user:pass@pr.proxynet.io:1080" https://httpbin.org/ip
```

| طرح | تبدیل نام میزبان به IP | نام کاربری و رمز | کاربرد |
|---|---|---|---|
| `http://` | پروکسی | بله | وب اسکرپینگ، API و بیشتر ابزارها |
| `https://` | پروکسی | بله | پورت پروکسی که با TLS کار می‌کند |
| `socks5h://` | پروکسی | بله | SOCKS5 با DNS هماهنگ با موقعیت پروکسی |
| `socks5://` | رایانه شما | بله | مقصدهایی که فقط DNS شما آن‌ها را می‌شناسد |
| `socks4a://` | پروکسی | فقط شناسه کاربر (User ID) | سرورهای قدیمی SOCKS4 |
| `socks4://` | رایانه شما | فقط شناسه کاربر (User ID) | سرورهای قدیمی SOCKS4 |

بسته به نسخه SOCKS، یکی از این طرح‌ها را به کار می‌برید. با `socks5://` سرور DNS شما همه میزبان‌هایی را که باز می‌کنید می‌بیند و سایت‌هایی که پاسخ را بر اساس موقعیت تنظیم می‌کنند، برای موقعیت شما پاسخ می‌دهند. با `socks5h://` نام میزبان را خود پروکسی resolve می‌کند نه رایانه شما و هر دو مشکل از میان می‌رود؛ برای اسکرپینگ معمولاً همین بهتر است. چرایی آن را در [نشت WebRTC و DNS: چیست و چگونه جلوی آن را بگیریم](/fa/blog/webrtc-dns-leak) توضیح داده‌ایم. گزینه قدیمی‌تر `--socks5-hostname host:port` معادل `socks5h://` است و نام کاربری و رمز در آن با `-U` فرستاده می‌شود؛ گزینه `--socks5` هم معادل `socks5://` است و DNS را روی رایانه شما انجام می‌دهد.

برای تفاوت‌های این دو پروتکل، [تفاوت پروکسی SOCKS و HTTP](/fa/blog/socks-vs-http-proxy) و [پروکسی SOCKS5: چطور کار می‌کند و چه فرقی دارد](/fa/blog/socks5-proxy-101) را بخوانید. [پروکسی SOCKS5](https://proxynet.io/fa/socks5-proxy) در Proxynet روی پورت جداگانه‌ای کنار پورت HTTP کار می‌کند.

## چگونه پروکسی را برای همه دستورهای cURL تنظیم کنیم؟

| روش | دامنه اثر | نمونه |
|---|---|---|
| `-x` | یک دستور | `curl -x "http://user:pass@host:port" URL` |
| متغیر محیطی | نشست پوسته | `export https_proxy="http://user:pass@host:port"` |
| `.curlrc` | همه اجراهای همان کاربر | `proxy = "http://host:port"` |

**متغیرهای محیطی.** cURL برای مقصدهای HTTP متغیر `http_proxy`، برای HTTPS متغیر `https_proxy` یا `HTTPS_PROXY` و در نبود این‌ها `ALL_PROXY` را می‌خواند. `http_proxy` فقط با حروف کوچک کار می‌کند (محافظتی برای برنامه‌های CGI)، پس `HTTP_PROXY` در Linux و macOS نادیده گرفته می‌شود. در PowerShell: `$env:HTTPS_PROXY = "http://user:pass@host:port"`. wget، pip و git هم همین متغیرها را می‌خوانند؛ [استفاده از پروکسی در wget](/fa/blog/wget-proxy) و [صفحه متغیرهای پروکسی در everything curl](https://everything.curl.dev/usingcurl/proxies/env.html) را ببینید.

**فایل پیکربندی.** cURL پیش از هر اجرا فایل `~/.curlrc` را می‌خواند (در Windows فایل `%USERPROFILE%\.curlrc` یا `_curlrc`):

```text
proxy = "http://pr.proxynet.io:8000"
proxy-user = "user:pass"
```

اگر `-q` را اولین گزینه بنویسید (`curl -q URL`)، cURL این فایل را برای همان یک اجرا نادیده می‌گیرد.

**استثناها.** با `--noproxy "localhost,.internal.example"` یا متغیر `NO_PROXY`، این میزبان‌ها مستقیم وصل می‌شوند. هر نام زیردامنه‌هایش را هم در بر می‌گیرد، بازه‌های CIDR مانند `192.168.0.0/16` کار می‌کنند و تنها نویسه عام (wildcard) قابل قبول یک `*` تنهاست. `NO_PROXY` حتی با `-x` هم اعمال می‌شود.

cURL موتور JavaScript ندارد، پس نمی‌تواند فایل PAC را اجرا کند. اگر شبکه شما از چنین فایلی استفاده می‌کند، آن را بخوانید ([فایل PAC چیست؟](/fa/blog/pac-file)) و پروکسی‌ای را که برمی‌گرداند با `-x` به cURL بدهید.

## چگونه بفهمیم cURL از پروکسی استفاده می‌کند؟

دستور `curl https://api.ipify.org` را یک بار بدون `-x` و یک بار با آن اجرا کنید: اگر آدرس دوم متفاوت و در کشور مورد انتظار باشد، پروکسی کار می‌کند. یک درخواست سالم HTTPS از طریق پروکسی HTTP در خروجی `-v` این سطرها را نشان می‌دهد:

```text
* Establishing HTTP proxy tunnel to httpbin.org:443
> CONNECT httpbin.org:443 HTTP/1.1
> Proxy-Authorization: Basic dXNlcjpwYXNz
< HTTP/1.1 200 Connection Established
* CONNECT tunnel established, response 200
```

مقدار `Proxy-Authorization` فقط با Base64 کدگذاری شده و رمزگذاری نیست؛ پیش از به اشتراک گذاشتن خروجی آن را پاک کنید. در اسکریپت‌ها `-w` نتیجه را در یک سطر چاپ می‌کند:

```bash
curl -s -o /dev/null -x "http://user:pass@pr.proxynet.io:8000" \
  -w "%{http_code} connect=%{http_connect} proxy_used=%{proxy_used}\n" https://httpbin.org/ip
```

`http_connect` پاسخ پروکسی به CONNECT است؛ `proxy_used` (از ⁦curl 8.7⁩ به بعد) وقتی از پروکسی استفاده شده باشد مقدار `1` دارد. برای بررسی موقعیت، سرعت و نشت، نوشته [آیا پروکسی کار می‌کند؟ چگونه پروکسی را آزمایش کنیم](/fa/blog/how-to-test-a-proxy) را ببینید.

## نمونه: دانلود فهرستی از URLها از طریق پروکسی با تلاش دوباره

این اسکریپت URLهای فایل `urls.txt` را چهارتا چهارتا از طریق پروکسی دانلود می‌کند، خطاهای موقت را دوباره امتحان می‌کند و وضعیت و مدت هر درخواست را چاپ می‌کند. به cURL و یک پوسته POSIX (Linux، macOS یا Git Bash) نیاز دارد:

```bash
#!/usr/bin/env bash
# fetch.sh: download every URL in urls.txt through the proxy, 4 at a time
set -u
PROXY="${PROXY:-http://user:pass@pr.proxynet.io:8000}"

sed 's/^/url = /' urls.txt | curl \
  --parallel --parallel-max 4 \
  --proxy "$PROXY" \
  --connect-timeout 10 --max-time 30 \
  --retry 3 --retry-connrefused \
  --fail --silent --show-error \
  --create-dirs --output-dir pages --remote-name-all \
  --write-out "%{http_code} %{time_total}s %{url}\n" \
  --config -
```

- `--config -` سطرهای `url = …` را از `sed` می‌خواند و باید **آخر از همه** بیاید، چون `--remote-name-all` فقط روی URLهایی اثر دارد که پس از آن اضافه می‌شوند.
- `--retry 3` خطاهای timeout و پاسخ‌های 408، 429، 500، 502، 503، 504، 522 و 524 را دوباره امتحان می‌کند، به ترتیب 1، 2 و 4 ثانیه صبر می‌کند و هدر `Retry-After` را رعایت می‌کند.
- `--max-time` انتقالی را که گیر کرده متوقف می‌کند؛ `--fail` خطاهای HTTP را به کد خروج 22 تبدیل می‌کند.
- وقتی همه URLها روی یک سایت‌اند، `--parallel-max` را پایین نگه دارید؛ درخواست‌های موازی زیاد ممکن است پاسخ 429 به همراه داشته باشند.

در آزمایش ما چهار صفحه ذخیره شد، یک URL که 503 برمی‌گرداند سه بار دوباره امتحان شد و در پایان اسکریپت با کد 22 خارج شد.

برای اینکه ببینید گیت‌وی شما IP را می‌چرخاند یا نه، درخواست به api.ipify.org را چند بار تکرار کنید: گیت‌وی چرخشی هر بار IP تازه‌ای برمی‌گرداند و نشست ثابت در Proxynet یک IP را به مدت 1 تا 60 دقیقه نگه می‌دارد. در [چرخش IP چیست و چگونه کار می‌کند؟](/fa/blog/ip-rotation-explained) توضیح داده‌ایم هر کدام کجا به کار می‌آید؛ [پروکسی مسکونی](https://proxynet.io/fa/residential-proxy) از هر دو پشتیبانی می‌کند. برای دانلودهای سریع و انبوه از مقصدهایی که سخت‌گیر نیستند، [پروکسی دیتاسنتر](https://proxynet.io/fa/datacenter-proxy) هم کافی است.

## خطاهای رایج پروکسی در cURL و راه رفع آن‌ها

پیام‌ها همان‌طور که ⁦curl 8.21⁩ در آزمایش‌های ما چاپ کرد:

- **`curl: (5) Could not resolve proxy: …`** نام میزبان پروکسی اشتباه است: املای آن و گیومه‌های اضافه را بررسی کنید.
- **`curl: (7) Failed to connect to … over proxy …`** روی آن پورت چیزی پاسخ نمی‌دهد (یا چون پورتی ننوشته‌اید، cURL سراغ یک پورت پیش‌فرض رفته است)، یا فایروال جلوی اتصال را می‌گیرد.
- **`curl: (7) CONNECT tunnel failed, response 407`** نام کاربری یا رمز اشتباه است، نویسه‌های ویژه کدگذاری نشده‌اند یا IP شما در لیست سفید نیست. نسخه‌های قدیمی‌تر پیام `curl: (56) Received HTTP code 407 from proxy after CONNECT` را چاپ می‌کنند؛ برای مقصدهای `http://` فقط کد وضعیت 407 را می‌گیرید. [کدهای وضعیت HTTP در وب اسکرپینگ](/fa/blog/http-status-codes-web-scraping) را ببینید.
- **`curl: (56) Proxy CONNECT aborted`** پروکسی اتصال را بست؛ در آزمایش ما یک نشانی `http://` به پورت SOCKS5 اشاره می‌کرد.
- **`curl: (97) Received invalid version in initial SOCKS5 response.`** یک نشانی `socks5://` به پورت HTTP اشاره می‌کند. پیام `User was rejected by the SOCKS5 server` یعنی نام کاربری یا رمز SOCKS اشتباه است.
- **`curl: (28) Connection timed out after … milliseconds`** پاسخی در زمان مقرر نرسید؛ [خطای پروکسی چیست؟ رفع خطای پاسخ ندادن سرور پروکسی](/fa/blog/proxy-server-not-responding) را ببینید.
- **`curl: (35) …` یا `SSL_ERROR_SYSCALL`** دست‌دهی TLS شکست خورد: `https://` روی پورت ساده پروکسی، یا دستگاهی در مسیر که اتصال‌های TLS را قطع می‌کند.
- **`curl: (60) SSL certificate problem: unable to get local issuer certificate`** اغلب نشانه پروکسی سازمانی‌ای است که TLS را بازرسی می‌کند. به‌جای `-k` گواهی CA آن را نصب کنید.
- **پروکسی نادیده گرفته می‌شود.** دنبال `NO_PROXY`، `HTTP_PROXY` با حروف بزرگ یا یک `.curlrc` دیگر بگردید؛ `-v` نشان می‌دهد cURL اول به کدام آدرس وصل می‌شود. معادل همین خطاها در Python را در [خطای Max Retries Exceeded With URL چیست و چگونه رفع می‌شود؟](/fa/blog/max-retries-exceeded-with-url) بررسی کرده‌ایم.

## راهنمای انتخاب

| نیاز | پیشنهاد |
|---|---|
| یک بار آزمودن پروکسی تازه | `curl -x "http://user:pass@host:port" https://httpbin.org/ip` |
| رمز شامل `@`، `:` یا `#` است | `-U "user:pass"` یا کدگذاری درصدی رمز |
| تبدیل نام میزبان به IP در سمت پروکسی | `socks5h://`، نه `socks5://` |
| FTP، SMTP یا پروتکل دیگری غیر از HTTP | SOCKS5، یا `-p` همراه پروکسی HTTP |
| پروکسی برای یک نشست پوسته | `export https_proxy=…` و `http_proxy` با حروف کوچک |
| پروکسی برای همه اجراها | `proxy = "…"` در `~/.curlrc` |
| بدون رمز در اسکریپت‌ها | لیست سفید IP در پنل |
| IP ثابت برای فرایند ورود به حساب | نشست ثابت از «Endpoint Generator» |

## پرسش‌های متداول

### آیا cURL از تنظیمات پروکسی سیستم در Windows یا macOS استفاده می‌کند؟

خیر. cURL پروکسی را فقط از `-x`، از متغیرهای محیطی و از `.curlrc` می‌گیرد. پروکسی‌ای که در تنظیمات Windows یا در System Settings در macOS تعریف شده باشد روی آن اثری ندارد.

### چگونه cURL را وادار کنیم برای یک درخواست پروکسی را نادیده بگیرد؟

کافی است `--noproxy "*"` یا `-x ""` را اضافه کنید. هر کدام همان دستور را مستقیم می‌فرستد، حتی وقتی `https_proxy` یا `.curlrc` پروکسی تعیین کرده باشد.

### چرا دستور پروکسی cURL در PowerShell شکست می‌خورد؟

در ⁦Windows PowerShell 5.1⁩ دستور `curl` نام مستعار `Invoke-WebRequest` است که گزینه `-x` را نمی‌شناسد. برای اجرای cURL واقعی `curl.exe` را بنویسید. در ⁦PowerShell 7⁩ این نام مستعار دیگر وجود ندارد.

### تفاوت socks5 و socks5h در cURL چیست؟

با `socks5://` رایانه شما نام میزبان را به IP تبدیل می‌کند؛ با `socks5h://` این کار را پروکسی انجام می‌دهد، پس DNS با موقعیت پروکسی هماهنگ است.

### آیا می‌توان در PHP از cURL با پروکسی استفاده کرد؟

بله. توابع cURL در PHP از libcurl استفاده می‌کنند: `CURLOPT_PROXY` نشانی را تعیین می‌کند، `CURLOPT_PROXYUSERPWD` نام کاربری و رمز را و `CURLOPT_PROXYTYPE` نوع SOCKS را. نمونه‌ها در [وب اسکرپینگ با PHP: cURL، Guzzle و تنظیم پروکسی](/fa/blog/php-web-scraping) آمده‌اند.

### آیا cURL می‌تواند در هر درخواست پروکسی را بچرخاند؟

cURL در هر دستور از یک پروکسی استفاده می‌کند. گیت‌وی چرخشی برای هر اتصال IP خروجی تازه‌ای می‌دهد، پس حلقه‌ای از دستورها هر بار IP متفاوتی می‌گیرد. چند URL در یک دستور معمولاً از یک اتصال مشترک استفاده می‌کنند و IP آن را هم مشترک دارند.

## خلاصه

برای استفاده از cURL با پروکسی، `-x` را با نشانی کامل اضافه کنید: طرح، نام کاربری و رمز، میزبان و پورت. برای بیشتر کارها `http://` و برای SOCKS5 با DNS سمت پروکسی `socks5h://` را به کار ببرید، وقتی همه دستورها به پروکسی نیاز دارند آن را در `https_proxy` یا `.curlrc` بگذارید و `-k` را فقط برای آزمون نگه دارید. وقتی دستوری شکست می‌خورد، کد خروج و خروجی `-v` نشان می‌دهند که مشکل از نشانی است، از نام کاربری و رمز یا از مقصد. برای نقطه‌های اتصال مسکونی، موبایل و SOCKS5 که با همین دستورها کار می‌کنند، [پروکسی‌های Proxynet](/fa/proxy) را ببینید.
