خطای ۵۰۰ در وردپرس، یکی از آن خطاهایی است که کاربر پشت صحنه را به سرعت به دو دسته تقسیم می‌کند: کسانی که می‌دانند باید از کجا شروع کنند و کسانی که با هر تلاش شتاب‌زده، وضعیت را بدتر می‌کنند. من در سال‌ها کار روی سایت‌های وردپرسی، به‌سختی سایت زنده‌ای را به یاد می‌آورم که هیچ‌وقت خطای ۵۰۰ نگرفته باشد؛ تفاوت در این نیست که این خطا رخ می‌دهد یا نه، تفاوت در سرعت و دقت واکنش ماست.

پیام رسمی خطا بسیار ساده است: «Internal Server Error». این سادگی، گمراه‌کننده است؛ چون پشت این سه کلمه، طیف گسترده‌ای از علت‌ها پنهان است — از یک کاما اشتباه در .htaccess تا پر شدن حافظهٔ سرور یا نقض قرارداد یک افزونه. اگر با ساختار وردپرس آشنایی پایه دارید، در این مقاله همراه من باشید تا همان مسیری را طی کنیم که در پروژه‌های واقعی برای پیدا کردن علتِ ۵۰۰ طی می‌کنم.

خطای ۵۰۰ دقیقاً چیست؟

خطای ۵۰۰ یک کد وضعیت HTTP است که در استاندارد وب، معنایش این است: «سرور درخواست شما را دریافت کرد، اما در پردازش آن به مشکلی خورد که مانع پاسخ‌دهی شد.» توجه کنید که این خطا از سمت سرور می‌آید، نه از مرورگر و نه از شبکه. مرورگر شما فقط پیام سرور را نمایش می‌دهد.

نکتهٔ ظریف که در تجربه‌ام زیاد به آن برخورده‌ام: کد ۵۰۰ یک «چتر بزرگ» است. سرور می‌تواند به دلایل کاملاً متفاوتی این کد را برگرداند؛ از یک خطای PHP در یک فایل قالب، تا سقوط سرور در اثر فشار منابع، تا یک خطای داخلی در وب‌سرور مثل Apache یا Nginx. به همین دلیل، اولین اشتباهی که می‌توانید مرتکب شوید، این است که فرض کنید «همهٔ خطاهای ۵۰۰ یکسان‌اند». در واقع باید بپرسید «این ۵۰۰ از کدام لایه آمد؟»

در سئو تکنیکال توضیح داده‌ام که پاسخ‌های ۵xx چگونه می‌توانند به بودجهٔ خزش گوگل آسیب بزنند؛ اگر سایت شما به‌طور مکرر ۵۰۰ می‌دهد، اثرش فقط «لحظه‌ای» نیست؛ به‌مرور می‌تواند به اعتبار دامنه در چشم موتور جستجو هم ضربه بزند.

خطای ۵۰۰ به شما نمی‌گوید چه اتفاقی افتاده؛ فقط می‌گوید «جایی از دستم خارج شد». کار شما، بازگرداندن همان یک نقطه است، نه بازسازی کل معماری.

تفاوت ۵۰۰ با ۵۰۲، ۵۰۳ و صفحه سفید

این تمایز را به‌خصوص برای تازه‌کارها یادآوری می‌کنم؛ چون در گفت‌وگو با پشتیبانی هاست، این تفاوت‌ها به زمان پاسخ کمک می‌کند. جدول زیر را با تجربه‌ام از ده‌ها پرونده ساخته‌ام:

کد / علامتریشه‌ی معمولاولین جای نگاه کردن
500 Internal Server Errorخطای PHP، .htaccess، محدودیت منابعلاگ سرور و کد قالب/افزونه
502 Bad Gatewayارتباط بین reverse-proxy و PHP-FPMتنظیمات سرور و پشتیبانی هاست
503 Service Unavailableسرور موقتاً خارج از سرویس یا محدودسازیوضعیت سرویس هاست و rate-limit
504 Gateway Timeoutکندی بیش‌ازحد اسکریپتکوئری کند، cron گیر‌کرده، افزونه سنگین
صفحه سفید (WSOD)خطای Fatal PHP با display_errors خاموشافزونه یا functions.php

نکتهٔ مفید برای عیب‌یابی: اگر مرورگر شما به‌جای ۵۰۰، ۵۰۲ می‌دهد، احتمال زیادی وجود دارد که مشکل در لایهٔ سرور و نه در وردپرس باشد. اگر ۵۰۳ می‌گیرید و این خطا خودبه‌خود بعد از چند دقیقه می‌رود، معمولاً به‌خاطر محدودسازی منابع از طرف هاست است. اگر ۵۰۴ گرفتید، به‌دنبال اسکریپتی باشید که بیش از حد طول می‌کشد — یکی از مقصرهای همیشگی، کرون‌های گیر‌کرده در وردپرس است.

پنج ریشهٔ اصلی خطای ۵۰۰ در وردپرس

بر اساس تجربهٔ خودم در پروژه‌هایی که تشخیص داده‌ام، پنج ریشهٔ زیر بیش از نود درصد موارد را پوشش می‌دهند. تشخیص درست، یعنی بدانید کدام‌یک را اول چک کنید:

  1. خرابی یا ناسازگاری فایل .htaccess
  2. افزونهٔ معیوب یا تعارض بین افزونه‌ها
  3. خطای قالب یا کد سفارشی داخل آن
  4. رسیدن به سقف حافظه یا منابع سرور
  5. ناسازگاری کد با نسخهٔ فعلی PHP

در ادامه هرکدام را با نشانه‌ها و روش تشخیص جداگانه باز می‌کنم.

ریشهٔ اول: فایل .htaccess

فایل .htaccess در ریشهٔ سایت، دستورات سطح سرور را نگه می‌دارد: بازنویسی URL، محدودسازی دسترسی، ریدایرکت‌ها و کش. یک کاراکتر اضافه یا یک خط ناقص در این فایل، می‌تواند تمام سایت را با ۵۰۰ از کار بیندازد؛ چون وب‌سرور پیش از رسیدن به وردپرس، در همین فایل گیر می‌کند.

تشخیص: با FTP یا File Manager به ریشهٔ نصب وردپرس بروید و فایل .htaccess را دانلود کنید (برای پشتیبان) و سپس پاک یا نامش را موقتاً به .htaccess.bak تغییر دهید. سایت را ریلود کنید. اگر سایت برگشت، مقصر همین فایل بوده. وردپرس در صورت نیاز، خودش این فایل را از نو می‌سازد — کافی است به «تنظیمات ← پیوندهای یکتا» بروید و ذخیره کنید.

رفع: پس از بازیابی، فایل اصلی را خط‌به‌خط مرور کنید. رایج‌ترین دستورات معیوب، بلوک‌های ریدایرکت HTTPS و قوانین کش افزونه‌ها هستند. اگر مطمئن نیستید کدام خط مشکل دارد، نسخهٔ استاندارد وردپرس را از مستندات رسمی بردارید و سفارشی‌سازی‌های خود را یکی‌یکی روی آن سوار کنید.

هر بار که در .htaccess دست می‌برید، قبلش یک کپی از نسخهٔ سالم با تاریخ در نام بگیرید؛ هزینهٔ این کار چند ثانیه است و می‌تواند ساعتی از عمرتان را نجات دهد.

ریشهٔ دوم: افزونه‌های معیوب یا ناسازگار

افزونه‌ها بیشترین سهم را در خطاهای ۵۰۰ دارند و دلیلش هم روشن است: هر افزونه یک قطعه کد اجرایی است که در هر درخواست، داخل هستهٔ وردپرس اجرا می‌شود. اگر یکی از آن‌ها خطای Fatal بدهد یا با افزونهٔ دیگری بر سر یک هوک مشترک تعارض پیدا کند، نتیجه یک خطای ۵۰۰ سراسری است.

تشخیص: از طریق FTP، نام پوشهٔ wp-content/plugins را به plugins-off تغییر دهید. وردپرس افزونه‌ها را غیرفعال می‌بیند و سایت بالا می‌آید. سپس نام را برگردانید و از پیشخوان، افزونه‌ها را یکی‌یکی فعال کنید؛ بعد از هر فعال‌سازی، سایت را ریلود کنید تا لحظهٔ خطا را بگیرید.

رفع و انتخاب بلندمدت: اگر مقصر پیدا شد، سه گزینه دارید — به‌روزرسانی افزونه، جایگزینی با افزونه‌ای دیگر، یا اگر افزونه حیاتی است، حذف افزونه‌ای که با آن تعارض دارد. برای انتخاب افزونه‌ای که کمتر احتمال تعارض داشته باشد، از فهرست افزونه‌های ضروری وردپرس استفاده کنید. روش گام‌به‌گام عیب‌یابی افزونه‌ای را هم در یافتن افزونه مشکل‌ساز جداگانه نوشته‌ام.

یک نکتهٔ عملی دیگر که در پروژه‌های واقعی زیاد به‌کارم آمده: اگر خطای ۵۰۰ بلافاصله بعد از آپدیت یک افزونه ظاهر شد، اول نسخهٔ قبلی آن افزونه را از بکاپ بازگردانید، بعد به‌دنبال علت ریشه‌ای بروید. انتقال سایت به محیط استیجینگ پیش از هر آپدیت، این نوع سناریوها را بی‌خطر می‌کند.

ریشهٔ سوم: قالب و کدهای سفارشی

خطاهای ۵۰۰ ناشی از قالب، معمولاً دیرتر کشف می‌شوند چون کاربر تصور می‌کند «فقط یک صفحه» مشکل دارد. اما وقتی کد سفارشی در functions.php یا یکی از فایل‌های قالب خطای Fatal بدهد، سراسری می‌شود. شایع‌ترین علت هم کدهایی است که در ویرایشگر آنلاین قالب یا در فایل قالب والد، دست‌کاری شده‌اند.

تشخیص: با تغییر نام پوشهٔ قالب فعال (مثلاً wp-content/themes/mytheme به mytheme-off) وردپرس به قالب پیش‌فرض برمی‌گردد. اگر سایت بالا آمد، مقصر همین قالب بوده. توجه کنید که بعد از این کار، باید از طریق FTP به فایل‌های قالب دسترسی داشته باشید؛ ویرایشگر پیشخوان با قالب غیرفعال دیگر کار نمی‌کند.

پیشگیری: اگر تا امروز کدی در قالب والد نوشته‌اید، این لحظه بهترین وقت برای انتقال به چایلد تم است. این تغییر کوچک، هم خطاهای آینده را قابل تشخیص‌تر می‌کند، هم آپدیت قالب را امن. مقایسهٔ قالب استاندارد و غیراستاندارد در تشخیص قالب استاندارد نشان می‌دهد که قالب‌های ضعیف، از این نظر خیلی شکننده‌ترند.

و اگر تصمیم گرفتید قالب را عوض کنید — راهنمای کامل تغییر امن قالب وردپرس را قبل از هر اقدامی بخوانید؛ چون دام‌هایی دارد که بدون دیدنشان، ممکن است بعد از تغییر قالب هم دوباره با ۵۰۰ مواجه شوید.

ریشهٔ چهارم: محدودیت حافظه و منابع

وقتی PHP به سقف حافظهٔ اختصاصی برسد، پیام «Allowed memory size exhausted» می‌دهد. اگر این خطا در زمان اجرای یک درخواست به‌عنوان خطای Fatal رخ دهد و کد شما آن را نگرفته باشد، ممکن است در ظاهر به‌شکل ۵۰۰ بروز کند. این سناریو در هاست‌های اشتراکی با منابع کم، بسیار شایع است.

تشخیص: اگر خطا در زمان اجرای یک عملیات مشخص (مثل ذخیرهٔ یک برگهٔ سنگین، اجرای افزونهٔ بکاپ، یا آپلود تصویری با ابعاد بالا) ظاهر می‌شود، احتمال این ریشه بسیار بالا می‌رود. مقدار memory_limit فعلی را می‌توانید با phpinfo() یا از پنل هاست ببینید.

رفع: ابتدا از پشتیبانی هاست بخواهید مقدار را افزایش دهد — معمولاً از 128M به 256M یا 512M. اگر دسترسی به php.ini ندارید، در wp-config.php پیش از خط /* That's all, stop editing! */ این تعریف‌ها را اضافه کنید:

define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

اما همان‌طور که در بخش اشتباهات رایج خواهم گفت، افزایش حافظه فقط علامت را می‌پوشاند. باید بپرسید «چرا این درخواست این‌قدر حافظه می‌خواهد؟» پاسخ معمولاً یکی از این‌هاست: افزونهٔ سنگین، کوئری کند که در حلقه اجرا می‌شود، یا محتوای غیربهینه در دیتابیس. راهنمای افزایش سرعت وردپرس همین ریشه‌ها را باز می‌کند، و اگر هاست شما مرکز ماجراست، راهنمای انتخاب هاست کمک می‌کند تصمیم بلندمدت بگیرید.

ریشهٔ پنجم: ناسازگاری با نسخهٔ PHP

هر نسخهٔ PHP، قواعد دستوری و رفتار اجرایی خودش را دارد. افزونه یا قالبی که با PHP 7.4 نوشته شده، وقتی روی سرور PHP 8.2 اجرا شود، ممکن است خطاهای Deprecated یا حتی Fatal بدهد. از طرف دیگر، کد جدیدی که از قابلیت‌های PHP 8 استفاده می‌کند، روی سرور PHP 7.4 کار نمی‌کند.

تشخیص: از پنل هاست، نسخهٔ فعلی PHP را ببینید. اگر اخیراً نسخهٔ PHP را ارتقا داده‌اید و بلافاصله سایت ۵۰۰ داده، مقصر تقریباً حتمی همین است. برای بررسی سازگاری، ابتدا در محیط استیجینگ نسخهٔ جدید را تست کنید؛ هرگز مستقیم روی سایت زنده این تغییر را اعمال نکنید.

رفع: اگر نسخهٔ PHP جدید باعث خطا شده، یا افزونه/قالب ناسازگار را به‌روزرسانی کنید یا موقتاً نسخهٔ PHP را به نسخهٔ سازگار برگردانید و به‌دنبال نسخهٔ به‌روز کدها باشید. اگر روی سرور PHP قدیمی هستید و به‌خاطر افزونه‌ها نمی‌توانید ارتقا دهید، به‌دقت بسنجید که این تأخیر چقدر هزینه دارد؛ چون نسخه‌های قدیمی PHP پشتیبانی امنیتی نمی‌گیرند و ریسک نفوذ بالا می‌رود — نقطه‌ای که در بهترین افزونه‌های امنیتی وردپرس هم به آن اشاره کرده‌ام.

روش گام‌به‌گام تشخیص

وقتی با ۵۰۰ مواجه می‌شوم، ترتیب زیر را طی می‌کنم؛ ترتیب مهم است چون از ارزان به گران پیش می‌رود و در اکثر موارد، تا گام سوم علت مشخص می‌شود:

  1. آیا سایت به‌تازگی تغییر کرده؟ آخرین افزونه، قالب یا کد اضافه‌شده را در ذهن مرور کنید.
  2. فایل .htaccess را موقتاً پاک کنید. اگر سایت برگشت، مقصر پیدا شد.
  3. پوشهٔ plugins را غیرفعال کنید. اگر سایت بالا آمد، مقصر افزونه است.
  4. قالب را به پیش‌فرض سوئیچ کنید. اگر مشکل حل شد، مقصر قالب است.
  5. WP_DEBUG را روشن کنید و لاگ را ببینید.
  6. لاگ سرور را بخوانید — اگر مراحل بالا جواب نداد، پاسخ اینجاست.

یک تذکر مهم: قبل از هر تغییر روی سایت زنده، بکاپ کامل بگیرید. روشش در چگونه از سایت وردپرسی بکاپ بگیریم آمده — و بکاپی که تست بازگردانی نشده باشد، به حساب نمی‌آید.

خواندن لاگ سرور: کلید طلایی

اگر یک عادت را از این مقاله با خودتان ببرید، این است که لاگ سرور را ببینید. بیشتر خطاهای ۵۰۰ یک خط متن دقیق در لاگ دارند که مستقیم می‌گوید کدام فایل و کدام خط مقصر است. مسیر معمول لاگ در هاست‌های cPanel، /home/username/logs/ یا مشابه آن است. در DirectAdmin، مسیرها متفاوت‌اند و از پنل قابل دسترسی‌اند.

اگر لاگ سرور در دسترس نبود، WP_DEBUG را در wp-config.php فعال کنید:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

با این تنظیمات، خطاها در wp-content/debug.log نوشته می‌شوند و روی سایت زنده چیزی نمایش داده نمی‌شود. بعد از عیب‌یابی، WP_DEBUG را حتماً خاموش کنید؛ روشن ماندن آن روی تولید، هم کارایی را کم می‌کند هم اطلاعات حساس را لو می‌دهد.

رفع نهایی و راستی‌آزمایی

وقتی علت را پیدا کردید و رفع را اعمال کردید، سه لایه راستی‌آزمایی انجام دهید:

  1. بازدید در حالت ناشناس مرورگر برای دور زدن کش مرورگر.
  2. تست سه الگوی صفحهٔ کلیدی: خانه، یک نوشته، صفحهٔ تماس؛ اگر هر سه سالم بودند، خطای سراسری برطرف شده.
  3. مشاهدهٔ لاگ به مدت ۲۴ ساعت؛ اگر خطای جدیدی ثبت نشد، اطمینان‌حاصل کنید که مسئله در سطح ریشه رفع شده.

اگر سایت شما پشت CDN است، کش CDN را هم پاک کنید؛ در غیر این صورت، ممکن است کاربران همچنان نسخهٔ قدیمی خطا را ببینند. برای درک اینکه CDN چطور بر تجربهٔ کاربر اثر می‌گذارد و چرا پاک‌کردن کش آن مهم است، Core Web Vitals چیست نقطهٔ شروع خوبی است.

اشتباهات رایج در مواجهه با ۵۰۰

اشتباهچه پیامدی داردروش درست
حذف فوری افزونه‌های مشکوک بدون غیرفعال‌سازیاز دست دادن داده و تنظیماتغیرفعال‌سازی موقت از طریق FTP
افزایش حافظه به‌عنوان اولین راه‌حلپوشاندن علامت و بازگشت مسئلهاول لاگ، بعد افزایش آگاهانه
عیب‌یابی روی سایت زنده بدون بکاپیک اشتباه = فاجعهاستیجینگ یا بکاپ کامل
غیرفعال‌کردن نمایش خطا بدون لاگ‌گیریاز دست دادن سرنخ تشخیصفعال‌سازی WP_DEBUG_LOG
تغییر هم‌زمان چند متغیرنامشخص‌ماندن علت واقعیهر بار یک تغییر، یک اندازه‌گیری
خطای ۵۰۰ را با «حدس زدن» نمی‌شود حل کرد؛ با «حذف کردن» هم نه. باید آن را مثل یک پرونده ببینید و شواهد را جمع کنید.

پیشگیری بلندمدت

سه عادتی که در پروژه‌های خودم باعث شده خطاهای ۵۰۰ خیلی کمتر و کوتاه‌تر شوند:

  • هیچ تغییر مهمی را روی سایت زنده اعمال نکنید — یک محیط استیجینگ ساده راه بیندازید. اکثر هاست‌های وردپرس‌محور این امکان را یک‌کلیکی می‌دهند.
  • پیش از هر آپدیت، بکاپ بگیرید — به‌خصوص برای هسته، قالب و افزونه‌های کلیدی.
  • افزونه‌ها را کم و باکیفیت نگه دارید — هر افزونهٔ اضافی، یک احتمال خطای جدید است. راهنمای تأثیر افزونه‌ها بر سرعت و پایداری سایت برای این تصمیم‌گیری مفید است.

نگاه مهندسی در سطح پلتفرم

برای کسی که وردپرس را به‌عنوان بستر تولیدی می‌بیند، خطای ۵۰۰ یک «رویدادِ قابل‌پایش» است، نه یک بلای ناگهانی. سه تفکیک در این نگاه وجود دارد که در پروژه‌های مقیاس‌پذیر به آن رسیده‌ام:

یک — جداسازی خطا از درخواست. در یک معماری بالغ، هیچ خطای PHP نباید مسیر پاسخ HTTP را به‌طور مطلق ببندد. با استفاده از set_exception_handler و register_shutdown_function در یک پلاگین اجباری (mu-plugins)، می‌توان خطاهای کشنده را مهار کرد و به کاربر یک صفحهٔ خطای معنادار (نه صفحهٔ سفید یا ۵۰۰ خالی) نشان داد. این کار هم تجربهٔ کاربر را نجات می‌دهد هم به تیم فنی امکان می‌دهد خطا را ساخت‌یافته ثبت کند.

دو — مشاهده‌پذیری بیرونی به‌جای لاگ محلی. لاگ درون هاست، شکننده است: اگر حجم فایل بزرگ شود یا دسترسی به آن نباشد، عملاً کور می‌شوید. تجربه‌ام می‌گوید ترکیب یک سرویس پایش خطای بیرونی (مثل Sentry) با پایش uptime سطح خارجی، بسیار مؤثرتر از تکیه بر فقط debug.log است. آپ‌تایم‌مانیتورینگ حتی قبل از اینکه کاربر باخبر شود، به شما خبر می‌دهد که سایت ۵۰۰ می‌دهد.

سه — تحمل شکست لایه‌ای. در سیستمی که با افزونه‌های شخص‌ثالث کار می‌کند، فرض کنید «یک افزونه، روزی خراب خواهد شد». به‌جای اینکه امیدوار باشید این روز فرا نرسد، سوال درست این است: «وقتی یکی خراب شود، چه اتفاقی می‌افتد؟» اگر پاسخ «کل سایت می‌خوابد» است، هنوز به بلوغ عملیاتی نرسیده‌اید. قالب‌بندی درخواست‌ها در لایه‌های ایزوله، یا استفاده از fallback برای قالب و افزونه‌های حیاتی، همان چیزی است که وردپرس را از «یک ابزار» به «یک پلتفرم پایدار» ارتقا می‌دهد. نگاه عمیق‌تر به این موضوع در بحث چرا بعضی قالب‌ها سایت را کند می‌کنند هم دیده می‌شود؛ چون غالباً کندی و شکنندگی، دو روی یک سکه‌اند.

در نهایت، برخورد با ۵۰۰ در سطح پلتفرم یعنی پذیرفتن این واقعیت که سیستم‌های کامپوزیت (هسته + قالب + افزونه + سرور + PHP) هرگز «بی‌خطا» نمی‌شوند؛ تنها کاری که می‌توانیم بکنیم این است که خطا را کوتاه، قابل‌مشاهده و بدون آسیب به کسب‌وکار نگه داریم. سایت‌هایی که این اصل را در معماری خود جای داده‌اند، در برخورد با اولین خطا هم آرام‌اند و هم سریع.

حرف آخر

خطای ۵۰۰ در وردپرس، پیش از آنکه یک «مشکل فنی» باشد، یک «مسئلهٔ روش» است. وقتی ترتیب درست را بدانید — اول علامت را دقیق ببینید، بعد علت را از لاگ بگیرید، آخر رفع حداقلی و راستی‌آزمایی — این خطا از یک تهدید به یک تمرین روزمره تبدیل می‌شود. در تجربهٔ من، مرز بین یک سایت حرفه‌ای و یک سایت آماتور، نه در «نداشتن خطا» بلکه در «سرعت و آرامش در برخورد با آن» است؛ و این سرعت، چیزی نیست جز حاصل چارچوبی که به آن عادت کرده‌اید.

اگر این خطا را روی سایت خودتان دیده‌اید، احتمالاً یکی از پنج ریشه‌ای که در این مقاله باز کردم، مقصر بوده. اگر جایی گیر کردید و علت را پیدا نکردید، ممنون می‌شوم در دیدگاه‌ها تجربه‌تان را بنویسید — به‌خصوص اگر مسیر تشخیصی متفاوتی رفته‌اید؛ همان‌ها به خوانندهٔ بعدی که در همان نقطه گیر کرده، کمک واقعی می‌کند. اگر خطای شما از جنس دیگری بود، پیشنهاد می‌کنم در کنار این مقاله، عیب‌یابی مشکلات سرعت سایت را هم بخوانید؛ چون نیمی از پرونده‌های ۵۰۰ در واقع مسئلهٔ کندی مزمن هستند که تازه خودشان را نشان داده‌اند. 🛠️