روی لینکی کلیک میکنید و صفحهای تقریباً خالی میبینید: "403 Forbidden" با حروف درشت و زیر آن واژه nginx. سایت دیگری همین پاسخ منفی را با جمله "You don't have permission to access this resource" بیان میکند. گاهی هم کروم صفحه خاکستری خودش را نشان میدهد که میگوید دسترسی به سایت رد شد و در پایین آن "HTTP ERROR 403" آمده است.
همه اینها یک کد وضعیت HTTP هستند: سرور درخواست شما را دریافت کرده، آن را فهمیده و تصمیم گرفته است صفحه را به شما تحویل ندهد. در ادامه میخوانید 403 چه فرقی با 401 و 404 دارد، چگونه بفهمید چه کسی شما را رد کرده است، بازدیدکننده چه کارهایی میتواند بکند، صاحب سایت قاعده مسئول را چگونه در لاگها پیدا میکند و یک 403 را در کد خودتان یا از یک پروکسی چگونه بخوانید.
خطای 403 Forbidden یعنی چه؟
هر پاسخی که سرور وب میفرستد با یک کد وضعیت سهرقمی آغاز میشود. کدهای خانواده 400 میگویند مشکل در خود درخواست است و 403 کدی است که میگوید «میدانم چه میخواهید و پاسخ منفی است». استاندارد HTTP، یعنی RFC 9110، آن را سروری تعریف میکند که درخواست را فهمیده اما از انجام آن خودداری میکند. سرور میتواند دلیلش را در صفحهای که میفرستد توضیح دهد، اما مجبور نیست.
استاندارد دو نکته دیگر هم میافزاید. اگر وارد حساب شده بودید، 403 یعنی حساب شما برای این صفحه کافی نیست و تکرار درخواست چیزی را تغییر نمیدهد. سروری هم که میخواهد وجود یک صفحه را پنهان کند، ممکن است به جای آن 404 Not Found پاسخ دهد.
تفاوت 401، 403 و 404 چیست؟
| کد | نام | سرور چه میگوید | معمولاً چه چیزی کمک میکند |
|---|---|---|---|
401 | Unauthorized | «نمیدانم شما کیستید» | وارد شوید یا اطلاعات ورود معتبر بفرستید |
403 | Forbidden | «میدانم، و پاسخ منفی است» | حسابی دیگر، شبکهای دیگر یا اجازه خود سایت |
404 | Not Found | «اینجا چیزی نیست» یا «نمیگویم» | آدرس را بررسی کنید |
پاسخ 401 باید هدری همراه داشته باشد که به مرورگر میگوید چگونه وارد شود. پاسخ 403 چنین راهنماییای ندارد، پس ورود دوباره فقط وقتی کمک میکند که 403 از یک نشست از دست رفته آمده باشد. کد 407 نسخه پروکسیِ 401 است: پروکسی شما، نه سایت، نام کاربری و رمز عبور میخواهد.
خطای 403 گامبهگام چگونه رخ میدهد؟
درخواست از چند نقطه بازرسی میگذرد و هر کدام میتواند آن را رد کند:
- در ورودی. یک CDN (شبکهای از سرورها که از مکانهای بسیار به جای سایت پاسخ میدهد) یا یک فایروال، آدرس IP، کشور، نرخ درخواستها و خود درخواست شما را بررسی میکند.
- قاعدههای سرور وب. nginx، Apache یا یک متعادلکننده بار (load balancer) فهرست آدرسهای مجاز و ممنوع خود و قاعدههای
.htaccessرا اعمال میکند. - فایلها. سرور برای خواندن فایل به مجوز نیاز دارد؛ پوشهای که صفحه آغازین ندارد به جای فهرست شدن رد میشود.
- برنامه. کد سایت بررسی میکند که وارد حساب شدهاید و اجازه دیدن این صفحه را دارید.
- پاسخ منفی. نخستین نقطه بازرسی که «نه» بگوید با 403 پاسخ میدهد. اینکه چه کسی «نه» گفته است، تعیین میکند چه کسی میتواند مشکل را رفع کند.
صفحه 403 چه شکلی دارد و چه کسی آن را فرستاده است؟
ظاهر صفحه نشان میدهد کدام نقطه بازرسی شما را رد کرده است.
| آنچه میبینید | فرستنده | علت معمول |
|---|---|---|
| "403 Forbidden" و زیر آن nginx | nginx، سرور وب سایت | مجوز فایل، نبودن صفحه آغازین یا یک قاعده دسترسی |
| "403 Forbidden" و زیر آن openresty | OpenResty، نسخهای ساختهشده بر پایه nginx | همان علتهای nginx |
| "Forbidden" و "You don't have permission to access this resource." | Apache | مجوز فایل، قاعده .htaccess یا پوشهای بدون صفحه آغازین |
| "403 Forbidden" و "Request forbidden by administrative rules." | HAProxy، یک متعادلکننده بار | یک قاعده دسترسی در متعادلکننده بار |
| "403 Forbidden" و "Microsoft-Azure-Application-Gateway/v2" | فایروال Azure Application Gateway | یک قاعده امنیتی با درخواست شما منطبق شده است |
| "Sorry, you have been blocked" و یک Ray ID | Cloudflare | قاعده امنیتیای که سایت تنظیم کرده است |
| «دسترسی به … رد شد»، «شما اجازه مشاهده این صفحه را ندارید.» و "HTTP ERROR 403" (در رابط انگلیسی "Access to … was denied") | گوگل کروم یا مایکروسافت اج | سایت یک 403 بدون صفحه اختصاصی فرستاده است |
سطر آخر حرف خود مرورگر است: وقتی یک 403 خالی میرسد، کروم و اج صفحه را با متن خودشان پر میکنند و این متن چیزی درباره علت نمیگوید. برای صفحه Cloudflare، نوشته خطای Sorry, You Have Been Blocked توضیح میدهد Ray ID چیست و چه چیزی را برای سایت بفرستید.
چرا خطای 403 میگیرم؟
از سمت بازدیدکننده، اینها علتهای معمولاند:
- آدرس به یک پوشه یا فایل خصوصی اشاره میکند، مثلاً پوشهای بدون صفحه آغازین یا یک فایل پشتیبان.
- وارد حساب نشدهاید یا نشست شما تمام شده است. کوکی، فایل کوچکی که سایت در مرورگر شما نگه میدارد تا شما را به یاد بیاورد، ممکن است منقضی یا خراب شده باشد.
- حساب شما اجازه دسترسی ندارد، مثلاً به یک سند اشتراکی یا صفحه مدیریت.
- آدرس IP یا کشور شما مجاز نیست. برخی سایتهای دولتی، بانکی و شرکتی فقط بازدیدکنندگانی از کشورها یا شبکههای مشخص را میپذیرند و برخی پس از سوءاستفاده، محدودههایی از آدرسها را مسدود میکنند.
- آدرس VPN شما اعتبار پایینی دارد. افراد زیادی از یک آدرس VPN مشترک استفاده میکنند؛ اگر برخی از آنها رفتار نادرستی داشته باشند، سامانههای امنیتی ممکن است همه کسانی را که پشت آن آدرساند رد کنند.
- یک فیلتر امنیتی با درخواست منطبق شده است. فایروال برنامه وب (WAF) هر درخواست را با قاعدههایی مقایسه میکند که برای جلوگیری از حمله نوشته شدهاند و عبارت جستوجویی که نویسههایی مانند
'،--یا<script>دارد ممکن است شبیه حمله به نظر برسد. نوشته WAF چیست و چگونه کار میکند؟ توضیح میدهد این فیلترها چگونه تصمیم میگیرند. - یک افزونه درخواست را تغییر داده است، مثلاً با بازنویسی هدرها یا مسدود کردن اسکریپتها.
- درخواستهای زیادی فرستادهاید. برخی سایتها به رگباری از درخواستها، به جای 429 Too Many Requests معمول، با 403 پاسخ میدهند.
رفع خطای 403 بهعنوان بازدیدکننده
این گامها را به ترتیب پیش بروید؛ چند گام نخست فقط چند ثانیه طول میکشند.
- آدرس را بررسی کنید. دنبال غلط تایپی بگردید، سپس صفحه را از منوی خود سایت باز کنید.
- صفحه را یک بار دوباره بارگذاری کنید. کلید F5 یا دکمه مجدد بار کردن (در رابط انگلیسی Reload) را در صفحه خطای کروم بزنید. مرورگرها پاسخ 403 را برای استفاده دوباره نگه نمیدارند، مگر اینکه سایت چنین بگوید، پس بارگذاری دوباره واقعاً از نو درخواست میفرستد. اگر چیزی تغییر نکرد، دست نگه دارید؛ دهها بار بارگذاری دوباره میتواند یک قاعده محدودیت نرخ را فعال کند.
- دوباره وارد شوید. از حساب خارج شوید و دوباره وارد شوید، سپس صفحه را از صفحه اصلی سایت باز کنید.
- کوکیهای همان سایت را پاک کنید. در کروم: بیشتر > تنظیمات > حریم خصوصی و امنیت > کوکیهای طرف سوم > دیدن همه دادهها و اجازههای سایت، نام سایت را جستوجو کنید و حذف را انتخاب کنید (گامهای گوگل). این کار شما را فقط از همان سایت خارج میکند.
- یک پنجره ناشناس را امتحان کنید. در کروم، بیشتر > پنجره ناشناس جدید (Ctrl+Shift+N). این پنجره بدون کوکیهای سایت شروع میشود و افزونهها در آن خاموشاند، مگر اینکه خودتان اجازه داده باشید. اگر صفحه باز شد، علت یک کوکی یا یک افزونه بوده است؛ افزونهها را از مسیر بیشتر > افزونهها > مدیریت افزونهها یکییکی خاموش کنید.
- VPN یا پروکسی را خاموش کنید یا شبکه را عوض کنید. VPN را قطع کنید و صفحه را دوباره بارگذاری کنید، یا آن را در گوشی با اینترنت همراه امتحان کنید. اگر کار کرد، سایت آدرسهای آن VPN را نمیپذیرد.
- با سایت تماس بگیرید. آدرس دقیق، زمان، کاری که انجام میدادید و هر شناسهای که روی صفحه آمده است، مانند Ray ID یا شناسه رویداد (incident ID)، را بفرستید.
برای خطای 403 که سایت عمداً تنظیم کرده است، هیچ ترفند صادقانهای وجود ندارد. اگر سرویسی فقط بازدیدکنندگان کشور خودش را میپذیرد، راه ورود همان است که خودش پیشنهاد میکند: یک حساب، یک برنامه رسمی یا تیم پشتیبانی آن.
اگر سایت متعلق به شماست: علت را چگونه پیدا کنید؟
از اینجا شروع کنید که چه کسی پاسخ داده است. یادداشتهای Cloudflare درباره خطای 403 این را صریح میگوید: پاسخ 403 بدون نشان Cloudflare از سرور خود شما آمده است، معمولاً از قاعدههای مجوز، یک ماژول فایروال مانند mod_security یا قاعدههای مسدودسازی IP؛ پاسخ 403 با نشان Cloudflare از یک قابلیت امنیتی در تنظیمات Cloudflare شما آمده است. همین تقسیمبندی برای هر CDN یا فایروال دیگری هم کار میکند.
در سرور خودتان، لاگ خطا (error log) دلیل را میگوید. دقیقهای را که 403 رخ داد در آن جستوجو کنید:
| سطر لاگ | سرور | یعنی چه |
|---|---|---|
directory index of "/var/www/html/" is forbidden | nginx | پوشهای بدون صفحه آغازین؛ فهرست کردن پوشه خاموش است |
open() "/var/www/html/index.html" failed (13: Permission denied) | nginx | کاربر سرور نمیتواند فایل را بخواند |
access forbidden by rule | nginx | یک قاعده allow یا deny منطبق شده است |
AH01276: Cannot serve directory …: No matching DirectoryIndex … | Apache | پوشهای بدون صفحه آغازین؛ Indexes خاموش است |
AH01630: client denied by server configuration | Apache | یک قاعده Require در پیکربندی یا .htaccess |
چه چیزی را درست کنید:
- مجوزها. کاربری که سرور وب با آن اجرا میشود باید بتواند فایل را بخواند و وارد همه پوشههای بالای آن شود. راهنمای خود WordPress برای پوشهها 755 یا 750 و برای فایلها 644 یا 640 را توصیه میکند. هرگز مجوز 777 نگذارید: این مجوز به هر حساب کاربری روی سرور اجازه میدهد فایل را تغییر دهد.
- نبودن صفحه آغازین. یک فایل
index.htmlیاindex.phpاضافه کنید. روشن کردن فهرست پوشه (autoindex on،Options +Indexes) خطای 403 را از میان میبرد، اما همه فایلهای پوشه را به هر کسی نشان میدهد. - قاعدههای دسترسی. سطرهای
deny،Requireو.htaccessرا بررسی کنید، بهویژه پس از انتقال به میزبان تازه یا نصب یک افزونه امنیتی جدید. اگر سایت پشت CDN است، مطمئن شوید هیچ قاعدهای آدرسهای خود CDN را مسدود نمیکند. - محافظت در برابر هاتلینک. قاعدههایی که جلوی نمایش تصاویر شما در سایتهای دیگر را میگیرند، هدر Referer را بررسی میکنند؛ این هدر صفحهای را که درخواست از آن آمده است نام میبرد. مرورگرها همیشه آن را نمیفرستند، پس درخواستهای بدون این هدر را عبور دهید.
- فایروال. در Cloudflare، صفحه Analytics (تحلیل) را در بخش امنیت سایت باز کنید، زبانه Events (رویدادها) را انتخاب کنید و بر پایه آدرس IP بازدیدکننده فیلتر کنید؛ لاگ نمونهبرداریشده عمل انجامشده و قابلیتی را که آن عمل را انجام داده نشان میدهد. Azure Application Gateway وقتی WAF آن در حالت Prevention (پیشگیری) اجرا میشود با 403 پاسخ میدهد؛ راهنمای عیبیابی مایکروسافت نشان میدهد چگونه شناسه قاعده را پیدا کنید و به جای خاموش کردن WAF یک استثنای محدود اضافه کنید.
اگر قاعدههای شما به کشور بستگی دارد، یک خروجی پروکسی مسکونی در همان کشور دقیقاً همان صفحهای را نشانتان میدهد که بازدیدکنندهای در آنجا میبیند.
اگر در کد خود با 403 روبهرو شدید
در یک اسکریپت، 403 به شکل یک کد وضعیت میرسد و بدنه پاسخ اغلب بیش از آنچه مرورگر نشان میدهد توضیح میدهد. نخست آن را بخوانید. علتهای معمول:
- کلید جاافتاده، منقضی یا نادرست. APIها در اینکه کجا 401 و کجا 403 برگردانند با هم فرق دارند. Amazon API Gateway برای کلید API نامعتبر، توکن منقضی و متد یا مسیری که API ندارد 403 برمیگرداند؛ مورد آخر پیام "Missing Authentication Token" را نشان میدهد که بسیاری را به اشتباه میاندازد.
- کلید معتبر بدون مجوز لازم. توکن دامنه دسترسی (scope) لازم برای این نقطه اتصال (endpoint) را ندارد؛ فرستادن دوباره آن کمکی نمیکند.
- محافظت CSRF. برای اینکه سایتهای دیگر نتوانند به نام کاربر فرمی ارسال کنند (جعل درخواست میانسایتی یا CSRF)، فریمورکها ارسالی را که توکن صادرشده همراه فرم را ندارد رد میکنند؛ Django با 403 و پیام "CSRF verification failed. Request aborted." پاسخ میدهد.
- قاعدههای نرخ و ربات. API گیتهاب پس از گذشتن از محدودیت نرخ با 403 یا 429 پاسخ میدهد و در هدرها
x-ratelimit-remaining: 0میآید. فایروال یک سایت ممکن است با ترافیکی که خودکار به نظر میرسد همین کار را بکند.
در برابر قاعده نرخ یا ربات، مانند بازدیدکنندهای رفتار کنید که سایت میپذیرد: سرعت را کم کنید، یک User-Agent بفرستید که نام ابزار شما و یک نشانی تماس را دارد، از robots.txt پیروی کنید، هرجا API رسمی هست از آن استفاده کنید و اگر بیشتر لازم دارید اجازه بگیرید. کپی کردن هدرهای مرورگر یا عوض کردن آدرس IP تا وقتی یکی از درخواستها عبور کند، رفتن در برابر تصمیم سایت است، نه راهحل. کدهای وضعیت HTTP در وب اسکرپینگ فهرست میکند کدام کدها را باید دوباره امتحان کرد و کدام یعنی توقف.
403 از پروکسی شما آمده یا از سایت؟
پشت یک پروکسی، دو سرور میتوانند 403 بگویند. برای آدرس https:// کلاینت نخست با یک درخواست CONNECT از پروکسی میخواهد تونلی باز کند. اگر پروکسی رد کند، مثلاً چون قاعدههایش آن پورت را مجاز نمیدانند، سایت هرگز شما را ندیده است. اگر تونل باز شود و سایت رد کند، 403 همراه هدرهای خود سایت از درون تونل میرسد.
کتابخانه Requests در Python برای تونل ردشده خطای ProxyError همراه Tunnel connection failed: 403 Forbidden میدهد و 403 سایت را به شکل یک پاسخ معمولی برمیگرداند. این اسکریپت این دو را از هم جدا میکند:
import requests
PROXY = "http://user:pass@pr.proxynet.io:8000"
PROXIES = {"http": PROXY, "https": PROXY}
def who_sent_403(url):
try:
r = requests.get(url, proxies=PROXIES, timeout=20)
except requests.exceptions.ProxyError as err:
if "Tunnel connection failed: 403" in str(err):
return "the PROXY refused the tunnel; the site never saw the request"
raise
if r.status_code == 403:
return f"the SITE answered 403 (Server: {r.headers.get('Server', 'not sent')})"
return f"no 403, status {r.status_code}"
for url in ["https://httpbin.org/status/403", "https://httpbin.org:8443/"]:
print(url, "->", who_sent_403(url))آن را روی رایانه خودمان (Python 3.13، Requests 2.34) و از طریق یک پروکسی آزمایشی محلی اجرا کردیم که مانند بسیاری از پروکسیهای شرکتی فقط به پورت 443 تونل باز میکند. آدرس نخست یک صفحه آزمایشی عمومی است که همیشه با 403 پاسخ میدهد:
https://httpbin.org/status/403 -> the SITE answered 403 (Server: gunicorn/19.9.0)
https://httpbin.org:8443/ -> the PROXY refused the tunnel; the site never saw the requestآدرسهای ساده http:// از تونل استفاده نمیکنند، پس هر دو نوع به شکل پاسخ معمولی میرسند؛ هدر Server و خود صفحه آنها را از هم جدا میکنند. اگر سایتی بپذیرد که خزنده شما (crawler) واردش شود، فهرست مجاز آن به آدرسهایی نیاز دارد که تغییر نمیکنند و پروکسی ISP همین را فراهم میکند.
کجا ممکن است با 403 روبهرو شوید
- درگاههای دولتی، مالیاتی و بانکی که از خارج از کشور یا با VPN باز میشوند.
- سندهای اشتراکی و بخشهای مدیریتی که حساب شما اجازه دسترسی به آنها را ندارد.
- ورود با حساب گوگل درون مرورگر داخلی یک برنامه دیگر.
- تصاویری که از سایتی با محافظت هاتلینک جاسازی شدهاند.
- APIها پس از رسیدن به محدودیت نرخ، و ابزارهای رصد قیمت یا خزندههای سئو که فایروال آنها را ربات به حساب میآورد.
اشتباههای رایج
- پاک کردن کل حافظه پنهان (کش) بارها و بارها. فقط کوکیهای همان سایت اهمیت دارند.
- فرض اینکه سایت از کار افتاده است. 403 یعنی سرور روشن است و همین یک درخواست را رد میکند.
- صاحبان سایت: گذاشتن مجوز 777 یا روشن کردن فهرست پوشه برای اینکه خطا ناپدید شود.
- صاحبان سایت: مسدود کردن آدرسهای CDN با قاعده فایروال یا افزونه امنیتی.
- برنامهنویسان: تکرار پیاپی درخواست پس از 403 در یک حلقه بیوقفه. پاسخ منفی تغییر نمیکند و هر تلاش دوباره به شمارش نرخ اضافه میشود.
راهنمای انتخاب
| وضعیت شما | چه کنید |
|---|---|
| صفحه ساده "403 Forbidden" در یک آدرس | آدرس را بررسی کنید و از منوی سایت استفاده کنید |
| دیروز وقتی وارد حساب بودید کار میکرد | دوباره وارد شوید و کوکیهای همان سایت را پاک کنید |
| در پنجره ناشناس کار میکند | کوکی یا افزونهای را که پشت خطاست حذف کنید |
| یک Ray ID یا شناسه رویداد روی صفحه | آن را همراه زمان برای سایت بفرستید |
| سایت شما، لاگ میگوید "Permission denied" | مجوز فایلها و پوشهها را درست کنید |
اسکریپت شما Tunnel connection failed: 403 میگیرد | پروکسی رد کرده است؛ پورت و مقصد را بررسی کنید |
| اسکریپت شما 403 خود سایت را میگیرد | بدنه را بخوانید، سرعت را کم کنید، از API رسمی استفاده کنید |
پرسشهای متداول
آیا خطای 403 Forbidden تقصیر من است؟
گاهی. نشست منقضی، یک کوکی، یک افزونه یا VPN را میتوانید خودتان درست کنید. اگر سایت عمداً کشور، شبکه یا حساب شما را رد میکند، فقط خود سایت میتواند آن را تغییر دهد.
آیا VPN میتواند باعث خطای 403 شود؟
بله، و اغلب. آدرسهای VPN میان کاربران زیادی مشترکاند و برخی سایتها آنها را از اساس یا پس از سوءاستفاده از همان محدوده رد میکنند. اگر صفحه با VPN خاموش باز شود، سایت آدرس VPN را رد میکند.
چرا در گوشی 403 میگیرم اما در رایانه نه؟
گوشی اغلب از اینترنت همراه با آدرس IP دیگری استفاده میکند، ممکن است یک برنامه VPN فقط روی یکی از دستگاهها اجرا شود و هر مرورگر کوکیهای خودش را نگه میدارد. گوشی را روی همان وایفای امتحان کنید، سپس دادههای سایت را در مرورگر گوشی پاک کنید.
پیام "403 disallowed_useragent" هنگام ورود با گوگل یعنی چه؟
گوگل ورود درون نمای وب تعبیهشده یک برنامه (WebView) را رد میکند، چون آن برنامه میتواند آنچه را میان شما و گوگل رد و بدل میشود بخواند یا تغییر دهد. از مرورگر معمولی خود وارد شوید یا از توسعهدهنده برنامه بخواهید آن را درست کند.
مسدودسازی 403 چقدر طول میکشد؟
قاعده مجوز یا کشور تا وقتی کسی آن را تغییر دهد باقی میماند. قاعدههای نرخ و ربات معمولاً پس از چند دقیقه یا چند ساعت منقضی میشوند؛ برخی APIها زمان را در هدر Retry-After یا x-ratelimit-reset اعلام میکنند.
آیا 403 به سایت در جستوجوی گوگل آسیب میزند؟
بله، در صفحههای عمومی. گوگل صفحههایی را که با کدی از خانواده 4xx پاسخ میدهند ایندکس نمیکند و صفحههایی را که از قبل ایندکس شدهاند حذف میکند. همچنین از صاحبان سایت میخواهد برای کند کردن خزندهاش از 403 استفاده نکنند: کدهای 4xx به جز 429 سرعت خزش را تغییر نمیدهند.
خلاصه
خطای 403 Forbidden یعنی سرور درخواست شما را فهمیده و تصمیم گرفته است آن را انجام ندهد. اگر بازدیدکنندهاید، آدرس را بررسی کنید، دوباره وارد شوید، کوکیهای سایت را پاک کنید، پنجره ناشناس را بیازمایید و VPN را خاموش کنید؛ اگر باز هم رد شدید، با سایت تماس بگیرید. اگر صاحب سایت هستید، نخست بفهمید چه کسی پاسخ داده و سپس لاگ خطا را بخوانید. در کد، بدنه پاسخ را بخوانید و 403 پروکسی خود را از 403 سایت جدا کنید. برای پایش و جمعآوری دادهای که سایتها میپذیرند، انواع پروکسی را در صفحه پروکسی ما مقایسه کنید.




