رفع خطای 403 Forbidden در سایت و سرور

خطای 403 Forbidden یعنی سرور درخواست شما را فهمیده، ولی اجازه دسترسی نمی‌دهد. برخلاف 404 که فایل پیدا نشده، در 403 فایل یا صفحه وجود دارد اما قانونی مانع نمایش آن شده است. رایج‌ترین دلایل در سایت‌های وردپرسی و سرورهای لینوکسی چهار مورد است: دسترسی نادرست فایل‌ها، نبودن فایل index در پوشه، قانون در .htaccess یا تنظیم وب‌سرور، و مسدود شدن آدرس شما توسط فایروال یا افزونه امنیتی.

این راهنما ترتیب بررسی را از سریع‌ترین و رایج‌ترین دلیل شروع می‌کند. اگر به‌جای 403 خطای دیگری می‌بینید، خطای 500 Internal Server Error و خطای 502 Bad Gateway را ببینید.

پیش از شروع: خطای 403 Forbidden برای همه است یا فقط شما؟

از یک شبکه دیگر (مثلاً داده موبایل) سایت را باز کنید.

  • اگر برای شما 403 است ولی از شبکه دیگر باز می‌شود، آدرس شما مسدود شده (فایروال، Fail2ban، افزونه امنیتی یا قانون Cloudflare).
  • اگر از همه جا 403 است، مشکل از دسترسی فایل، تنظیم وب‌سرور یا قانون روی خود سایت است.

لاگ وب‌سرور دقیق‌ترین منبع است:

sudo tail -n 50 /var/log/nginx/error.log
sudo tail -n 50 /var/log/apache2/error.log

پیام‌هایی مثل directory index of ... is forbidden، Permission denied یا client denied by server configuration علت را مستقیم می‌گویند.

علت اول خطای 403 Forbidden: دسترسی و مالکیت فایل

وب‌سرور باید بتواند فایل را بخواند و به همه پوشه‌های مسیر آن وارد شود (دسترسی x). قاعده معمول برای سایت:

sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;
sudo chown -R www-data:www-data /var/www/example.com

نام کاربر وب‌سرور در توزیع‌ها فرق دارد (www-data، apache یا nginx). مقدار 777 را برای رفع مشکل نگذارید؛ مشکل را پنهان می‌کند و ریسک امنیتی می‌آورد. دستور namei -l /var/www/example.com/index.php دسترسی تک‌تک پوشه‌های مسیر را نشان می‌دهد. توضیح دسترسی‌ها در مدیریت دسترسی در لینوکس آمده است.

علت دوم: نبودن فایل index

اگر در پوشه سایت فایل index.php یا index.html نیست و فهرست‌نمایی پوشه هم خاموش است، پیام 403 می‌آید. بررسی کنید فایل وجود دارد و نام آن با تنظیم وب‌سرور هم‌خوان است.

در Nginx:

index index.php index.html;

در Apache:

DirectoryIndex index.php index.html

اگر وردپرس را تازه منتقل کرده‌اید، شاید فایل‌ها داخل یک پوشه اضافه قرار گرفته‌اند؛ مسیر root در تنظیم سایت را بررسی کنید. مراحل کامل انتقال در انتقال سایت وردپرس به هاست جدید آمده است.

علت سوم: قانون در .htaccess یا تنظیم وب‌سرور

در Apache، فایل .htaccess ممکن است قاعده‌ای مثل Deny from all یا Require all denied داشته باشد. برای آزمایش، فایل را موقتاً تغییر نام دهید:

mv .htaccess .htaccess.off

اگر سایت باز شد، علت داخل همان فایل بود. برای وردپرس می‌توانید از «تنظیمات > پیوندهای یکتا» و ذخیره، فایل تازه‌ای بسازید. در Nginx، دستورهای deny all یا allow در بلوک location را بررسی کنید و بعد از تغییر:

sudo nginx -t
sudo systemctl reload nginx

در Apache 2.4 به بعد، دستور Require با Allow/Deny قدیمی فرق دارد و ترکیب هر دو در یک فایل خطا می‌دهد. کانفیگ وب‌سرور در کانفیگ وب سرور لینوکس و نصب Nginx در نصب Nginx روی اوبونتو توضیح داده شده است.

علت چهارم: مسدود شدن آدرس شما

اگر فقط خودتان 403 می‌گیرید:

  • فایروال سرور یا افزونه امنیتی وردپرس چند ورود ناموفق را شمرده و آدرس را مسدود کرده است.
  • Fail2ban آدرس را بن کرده. بررسی با sudo fail2ban-client status sshd و باز کردن با sudo fail2ban-client set sshd unbanip 203.0.113.5. راه‌اندازی آن در نصب و تنظیم Fail2ban آمده است.
  • قانون WAF یا Cloudflare درخواست را رد می‌کند. در داشبورد Cloudflare بخش Security Events را ببینید.
  • ModSecurity یک درخواست را به‌اشتباه تهدید فرض کرده؛ در modsec_audit.log قاعده مسبب را می‌بینید.

آدرس عمومی خودتان را با ابزارهای آنلاین شبکه و سرور ببینید تا آدرسی را که با آن به سرور می‌رسید پیدا کنید.

علت پنجم: وردپرس و افزونه‌ها

  • افزونه امنیتی یا کش قانون اشتباه در .htaccess نوشته. پوشه افزونه‌ها را موقتاً تغییر نام دهید تا آزمایش شود: mv wp-content/plugins wp-content/plugins.off
  • فقط در wp-admin 403 می‌گیرید: ممکن است ورود به آن به IP خاصی محدود شده باشد.
  • بعد از بروزرسانی یا انتقال، دسترسی فایل‌ها عوض شده است.

علت ششم: SELinux

در AlmaLinux و Rocky، SELinux ممکن است دسترسی وب‌سرور را حتی با دسترسی درست فایل ببندد. نشانه، پیام AVC در /var/log/audit/audit.log است:

sudo ausearch -m avc -ts recent
sudo restorecon -Rv /var/www/example.com

دستور restorecon برچسب درست SELinux را به فایل‌ها برمی‌گرداند. به‌جای خاموش کردن کامل SELinux، همین روش را به کار ببرید.

جدول عیب‌یابی سریع

نشانه در لاگ یا رفتارعلت محتملراه حل
Permission deniedدسترسی یا مالکیت فایلchmod و chown درست
directory index ... is forbiddenنبود فایل indexساخت یا معرفی index
client denied by server configurationقانون Require یا denyبررسی کانفیگ و .htaccess
فقط شما 403 می‌گیریدمسدود شدن IPبررسی فایروال، Fail2ban، WAF
فقط wp-adminقانون محدودکننده یا افزونه امنیتیبررسی تنظیم محدودیت ورود
403 با پیام AVCSELinuxrestorecon

سوالات متداول

فرق 403 و 401 چیست؟

401 یعنی احراز هویت لازم است (نام کاربری و رمز). 403 یعنی درخواست فهمیده شده ولی اجازه دسترسی ندارید.

آیا 403 روی سئو اثر دارد؟

اگر ربات گوگل 403 بگیرد، صفحه ایندکس نمی‌شود. بررسی کنید فایروال یا Cloudflare ربات‌های مجاز را مسدود نکرده باشد.

چطور بفهمم مشکل از فایروال است یا فایل؟

از شبکه دیگر امتحان کنید و لاگ خطا را بخوانید. مسدودیت فایروال و مشکل دسترسی فایل پیام‌های متفاوتی در لاگ می‌گذارند.

بعد از رفع مشکل هنوز خطا می‌بینم

کش مرورگر، افزونه کش وردپرس و Cloudflare را پاک کنید. خطا ممکن است در کش مانده باشد.

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *