حلقه ریدایرکت بی‌نهایت یکی از آن خطاهای سردرگم‌کننده‌ی وردپرس است که سایت را در همان ثانیه‌ی اول از دسترس خارج می‌کند، ولی هیچ پیام فنی دقیقی درباره‌ی علت نشان نمی‌دهد. کاربر با پیام ERR_TOO_MANY_REDIRECTS رو‌به‌رو می‌شود، پیشخوان وردپرس هم باز نمی‌شود، و در تجربه‌ی چندساله‌ام، تقریباً همیشه مدیر سایت در همان لحظه دچار این خطای ذهنی می‌شود که مشکل از افزونه یا قالب است، در حالی که ریشه در جایی بسیار دورتر پنهان شده است.

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

حلقه ریدایرکت بی‌نهایت دقیقاً چه معنایی دارد؟

حلقه ریدایرکت بی‌نهایت زمانی رخ می‌دهد که مرورگر شما را از یک آدرس به آدرس دیگر، و از آن آدرس دوباره به آدرس اول می‌فرستد، بدون این‌که به مقصد نهایی برسد. مرورگر برای محافظت از کاربر، پس از تعداد مشخصی ریدایرکت (معمولاً بین ۲۰ تا ۲۰۰ بار)، این چرخه را متوقف می‌کند و پیام ERR_TOO_MANY_REDIRECTS را نشان می‌دهد. این پیام، در ظاهر ساده است ولی در عمل، چند لایه‌ی پنهان دارد که هرکدام می‌توانند منبع حلقه باشند.

برای درک عمیق‌تر این مفهوم، مفید است بدانید که ریدایرکت (redirect) به‌طور کلی یک پاسخ سرور است که به مرورگر می‌گوید «به این آدرس دیگر برو». توضیح تکمیلی این مفهوم در ویکی‌پدیا موجود است، ولی جان ماجرا در این نکته است که اگر این «برو» دوباره به خودِ آدرس اول برگردد، حلقه شکل می‌گیرد.

در تجربه‌ی چندساله‌ام روی سایت‌های وردپرسی، حلقه ریدایرکت تقریباً همیشه از یک ناسازگاری بین چند لایه می‌آید: یک لایه می‌گوید به HTTPS برو، لایه‌ی دیگر می‌گوید به HTTP برگرد. یک لایه می‌گوید دامنه را با www سرو کن، لایه‌ی دیگر می‌گوید بدون www. این تضاد، در ساده‌ترین حالت، وقتی رخ می‌دهد که افزونه‌ای ریدایرکت HTTPS را فعال می‌کند ولی گواهی SSL درست تنظیم نشده و سرور، درخواست HTTPS را به HTTP برمی‌گرداند.

نکته‌ی مهمی که در پروژه‌های واقعی بارها دیده‌ام این است که وردپرس و اکثر افزونه‌های آن، به‌طور پیش‌فرض هیچ محافظتی در برابر حلقه ریدایرکت ندارند. یعنی اگر یک افزونه اشتباهاً ریدایرکت متناقض تنظیم کند، بدون هیچ هشداری سایت در حلقه می‌افتد و کاربران نمی‌توانند وارد شوند. این ویژگی، یعنی مسئولیت پیشگیری کاملاً بر عهده‌ی مدیر سایت است. مباحث پایه‌ای مرتبط در وردپرس چیست و چگونه شروع کنیم باز شده است.

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

تفاوت آن با 301، 302 و خطاهای مشابه

چهار مفهوم که در بحث حلقه ریدایرکت زیاد با هم اشتباه گرفته می‌شوند، معنای فنی متفاوتی دارند و مسیر عیب‌یابی هر یک جداست:

مفهوممعناپیام در مرورگرنشانه‌ی تشخیص
ریدایرکت 301جابه‌جایی دائمیبدون پیام (اگر سالم باشد)سربرگ Location با کد 301
ریدایرکت 302جابه‌جایی موقتبدون پیام (اگر سالم باشد)سربرگ Location با کد 302
حلقه ریدایرکتچرخه‌ی بی‌پایانERR_TOO_MANY_REDIRECTSزنجیره‌ی طولانی Location در سربرگ
خطای 404منبع پیدا نمی‌شودصفحه‌ی 404کد وضعیت 404

تفکیک حلقه ریدایرکت از 404 در سئو اهمیت زیادی دارد: در 404، گوگل صفحه را از ایندکس خارج می‌کند؛ در حلقه ریدایرکت، گوگل نمی‌تواند صفحه را به‌درستی بررسی کند و رفتار نامشخصی نشان می‌دهد. مسیر دقیق عیب‌یابی 404 در رفع خطای 404 در وردپرس باز شده است. همچنین اگر سایت شما همراه با حلقه ریدایرکت خطای 500 هم نشان می‌دهد، مسیر عیب‌یابی آن در رفع خطای 500 Internal Server Error در وردپرس آمده است.

ده ریشه‌ی اصلی حلقه ریدایرکت در وردپرس

در عیب‌یابی حلقه ریدایرکت روی سایت‌های تولیدی، این ده ریشه بیش از بقیه تکرار می‌شوند. تشخیص دقیق، نیمی از راه‌حل است:

ریشه‌ی اول: ناسازگاری SSL و HTTPS

شایع‌ترین دلیل. اگر سایت شما در ریدایرکت HTTP به HTTPS باشد، ولی سرور نتواند اتصال HTTPS را به‌درستی سرو کند (مثلاً گواهی منقضی یا زنجیره‌ی ناقص)، سرور درخواست HTTPS را رد می‌کند و به HTTP برمی‌گرداند. این دو قاعده، حلقه‌ی بی‌پایان می‌سازند. راه‌حل: بررسی گواهی SSL و اطمینان از سلامت آن. مباحث مرتبط در رفع خطای SSL در سرور و نصب گواهی SSL باز شده است.

ریشه‌ی دوم: تفاوت siteurl و home

در وردپرس، دو تنظیم siteurl و home وجود دارند که مسیر سایت و آدرس اصلی را مشخص می‌کنند. اگر این دو ناسازگار باشند (مثلاً یکی با HTTPS و دیگری با HTTP، یا یکی با www و دیگری بدون www)، حلقه ریدایرکت شکل می‌گیرد.

ریشه‌ی سوم: تنظیم نادرست در wp-config

اگر در فایل wp-config.php مقدار WP_HOME یا WP_SITEURL تعریف شده باشد ولی با مقدار دیتابیس هماهنگ نباشد، حلقه رخ می‌دهد. این سناریو معمولاً بعد از مهاجرت سرور یا تغییر دامنه شایع است.

ریشه‌ی چهارم: رکوردهای DNS ناسازگار

اگر دامنه‌ی شما هم روی www و هم بدون www پاسخ می‌دهد و هرکدام از این دو، ریدایرکت به دیگری دارد، حلقه شکل می‌گیرد. راه‌حل: انتخاب یک نسخه‌ی اصلی (canonical) و ریدایرکت نسخه‌ی دیگر به آن. مباحث مرتبط در DNS چیست و چگونه کار می‌کند باز شده است.

ریشه‌ی پنجم: قواعد htaccess متناقض

فایل .htaccess می‌تواند شامل چند قاعده‌ی ریدایرکت باشد که با هم تضاد دارند. مثلاً یک قاعده دامنه را به HTTPS و قاعده‌ی دیگر به www هدایت می‌کند. اگر این دو قاعده همدیگر را نقض کنند، حلقه رخ می‌دهد.

ریشه‌ی ششم: تداخل CDN با سرور اصلی

اگر CDN (مثل Cloudflare) تنظیمات SSL و ریدایرکت داشته باشد و سرور اصلی هم تنظیمات مشابهی داشته باشد، دو قاعده‌ی متناقض می‌توانند حلقه بسازند. این سناریو در سایت‌هایی که اخیراً به CDN منتقل شده‌اند، شایع‌تر است.

ریشه‌ی هفتم: افزونه‌های امنیتی و ریدایرکت

افزونه‌های امنیتی مثل Wordfence یا افزونه‌های ریدایرکت مثل Redirection، گاهی قواعد متناقضی به .htaccess یا wp_options اضافه می‌کنند. اگر با سایر قواعد هماهنگ نباشند، حلقه رخ می‌دهد. مباحث مرتبط با این تضاد در رفع خطای تضاد افزونه‌ها در وردپرس باز شده است.

ریشه‌ی هشتم: مشکل در پیکربندی پیشخوان امن

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

ریشه‌ی نهم: تغییر دامنه بدون به‌روزرسانی URLها

اگر دامنه‌ی سایت تغییر کرده ولی در دیتابیس، لینک‌های داخلی به دامنه‌ی قدیمی اشاره می‌کنند، ممکن است درخواست‌ها بین دو دامنه در حلقه بیفتند. راه‌حل: به‌روزرسانی URLها در دیتابیس با ابزارهای تخصصی.

ریشه‌ی دهم: خطای قالب یا کد سفارشی

اگر در functions.php قالب یا کد سفارشی، تابع ریدایرکت بدون شرط توقف تعریف شده باشد، سایت در حلقه می‌افتد. این سناریو در قالب‌هایی که منطق مدیریت کاربر یا احراز هویت دارند، شایع‌تر است. مباحث مرتبط با ساختار قالب در قالب چایلد وردپرس باز شده است.

پروتکل واکنش سریع در بحران

اگر سایت شما همین حالا در حلقه ریدایرکت است و هیچ‌کس نمی‌تواند وارد شود، این پنج حرکت را به همین ترتیب اجرا کنید:

  1. تعیین دامنه‌ی خطا: سریع تست کنید که آیا همه‌ی کاربران در حلقه هستند یا فقط بخشی. اگر همه‌ی سایت در حلقه است، ریشه در تنظیمات SSL یا دامنه است. اگر فقط بعضی صفحات، به سراغ افزونه یا قالب بروید.
  2. غیرفعال‌سازی موقت افزونه‌های مشکوک: اگر از طریق FTP یا File Manager به سایت دسترسی دارید، پوشه‌ی افزونه‌های اخیراً فعال‌شده را موقتاً تغییر نام دهید.
  3. بازگرداندن htaccess به نسخه‌ی پیش‌فرض: فایل .htaccess را به نسخه‌ی استاندارد وردپرس برگردانید.
  4. اصلاح siteurl و home در wp-config: اگر از طریق FTP به فایل دسترسی دارید، مقادیر WP_HOME و WP_SITEURL را به دامنه‌ی اصلی سایت تنظیم کنید.
  5. بررسی SSL و DNS: اگر ریشه در SSL است، به سراغ بخش‌های بعدی این مقاله بروید.

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

تشخیص دقیق با DevTools و curl

برای پیدا کردن ریشه‌ی حلقه، باید زنجیره‌ی ریدایرکت‌ها را دقیق ببینید. دو ابزار کلیدی که در پروژه‌ها زیاد از آن‌ها استفاده می‌کنم:

DevTools مرورگر

در مرورگر، ابزار DevTools را باز کنید (کلید F12) و به تب Network بروید. گزینه‌ی Preserve log را فعال کنید، سپس صفحه را ریلود کنید. تمام ریدایرکت‌ها در این تب ثبت می‌شوند و می‌توانید زنجیره‌ی کامل را ببینید. ستون Status کد پاسخ (301، 302) و ستون Location آدرس بعدی را نشان می‌دهد. اگر آدرس‌ها در چرخه‌ی بی‌پایان تکرار می‌شوند، ریشه را در همان زوج اول پیدا می‌کنید.

curl در خط فرمان

ابزار curl می‌تواند زنجیره‌ی ریدایرکت را به‌صورت دقیق نمایش دهد:

curl -I -L --max-redirs 10 https://yourdomain.com

گزینه‌ی -I فقط سربرگ‌ها را نشان می‌دهد، -L ریدایرکت‌ها را دنبال می‌کند و --max-redirs 10 حداکثر ۱۰ ریدایرکت را اجازه می‌دهد. اگر پیام Maximum (10) redirects followed را دیدید، سایت شما در حلقه ریدایرکت است. با دیدن هر خط location: می‌توانید زنجیره را ببینید:

curl -I -L --max-redirs 10 -s https://yourdomain.com | grep -iE "HTTP|location"

این دستور، تمام ریدایرکت‌ها را با کد وضعیت و مقصد نشان می‌دهد. اگر مقصدها بین دو آدرس تکرار شدند، ریشه همان‌جاست. مباحث مرتبط با خطاهای سرور در بررسی خطاهای سرور در لاگ‌ها باز شده است.

ابزارهای آنلاین ریدایرکت

سرویس‌هایی مثل Redirect Checker یا HTTP Status Code Checker می‌توانند زنجیره‌ی ریدایرکت را به‌صورت بصری نمایش دهند. این ابزارها برای بررسی سریع بدون دسترسی به خط فرمان، مفید هستند.

SSL، HTTPS و ریدایرکت‌های متناقض

SSL و HTTPS، شایع‌ترین ریشه‌ی حلقه ریدایرکت در سایت‌های وردپرسی هستند. توضیحات فنی SSL در ویکی‌پدیا موجود است، ولی برای مقصود ما، جان ماجرا در این است که چگونه ریدایرکت HTTP به HTTPS با سلامت گواهی هماهنگ می‌شود.

سناریو اول: گواهی منقضی و ریدایرکت فعال

اگر گواهی SSL منقضی شده باشد ولی ریدایرکت HTTP به HTTPS فعال باشد، سرور اتصال HTTPS را رد می‌کند و مرورگر کاربر را به HTTP برمی‌گرداند. این چرخه، حلقه‌ی بی‌پایان می‌سازد. راه‌حل: تمدید گواهی و سپس بررسی ریدایرکت. مباحث مرتبط در نصب گواهی SSL باز شده است.

سناریو دوم: دو قاعده ریدایرکت متناقض

اگر در .htaccess دو قاعده‌ی ریدایرکت وجود داشته باشد که یکی به HTTPS و دیگری به HTTP هدایت کند، حلقه رخ می‌دهد. این سناریو معمولاً بعد از نصب افزونه‌ی امنیتی که قاعده‌ی خودش را اضافه کرده، رخ می‌دهد.

سناریو سوم: ریدایرکت در چند لایه

اگر CDN، htaccess، افزونه‌ی وردپرس و قالب همزمان ریدایرکت HTTPS تعریف کنند، ممکن است به‌دلیل اختلاف در نسخه‌ی canonical، حلقه شکل بگیرد. قاعده‌ی اصلی: ریدایرکت را فقط در یک لایه تعریف کنید. مباحث مرتبط با تفاوت HTTP و HTTPS در HTTPS و HTTP در امنیت وب باز شده است.

روش تشخیص SSL به‌عنوان ریشه

با دستور زیر، به‌طور مستقیم بررسی کنید که آیا اتصال HTTPS سالم است:

curl -I https://yourdomain.com
curl -I http://yourdomain.com

اگر درخواست HTTPS خطا داد ولی HTTP پاسخ داد، ریشه در SSL است. اگر هر دو پاسخ دادند ولی سایت در حلقه است، ریشه در قواعد ریدایرکت است.

دامنه، www و رکوردهای DNS

دامنه و DNS، لایه‌ی بعدی ریشه‌های حلقه ریدایرکت هستند. اگر سایت شما هم روی example.com و هم روی www.example.com پاسخ می‌دهد و هرکدام ریدایرکت به دیگری دارد، حلقه شکل می‌گیرد.

انتخاب نسخه‌ی اصلی دامنه

اولین تصمیم این است که سایت شما در کدام نسخه سرو شود: با www یا بدون www. این تصمیم را در تمام لایه‌ها (DNS، htaccess، وردپرس) یکسان اعمال کنید. توصیه‌ی من: نسخه‌ی بدون www به‌عنوان نسخه‌ی اصلی، و ریدایرکت 301 از www به بدون www در لایه‌ی سرور. مباحث مرتبط در مدیریت DNS در cPanel باز شده است.

بررسی رکوردهای A و CNAME

با دستور زیر، بررسی کنید که رکوردهای A و CNAME دامنه به کدام آی‌پی اشاره می‌کنند:

dig yourdomain.com A
dig www.yourdomain.com A
dig yourdomain.com CNAME

اگر هر دو رکورد به یک آی‌پی اشاره می‌کنند و سرور شما فقط یک نسخه را canonical می‌داند، باید ریدایرکت از نسخه‌ی غیرcanonical به canonical در لایه‌ی سرور (نه وردپرس) تعریف شود. مباحث مرتبط در DNS چیست و چگونه کار می‌کند باز شده است.

htaccess و قواعد سرور

فایل .htaccess در آپاچی، شایع‌ترین جای بروز قواعد متناقض است. اگر این فایل به‌اشتباه ویرایش شود، می‌تواند سایت را در حلقه بیندازد.

قواعد استاندارد ریدایرکت

برای ریدایرکت HTTP به HTTPS، قاعده‌ی استاندارد به این شکل است:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

برای ریدایرکت www به بدون www:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [L,R=301]

ترکیب این دو قاعده می‌تواند حلقه بسازد اگر به‌درستی هماهنگ نشوند. توصیه: یک قاعده‌ی ترکیبی بنویسید که هر دو تبدیل را در یک ریدایرکت انجام دهد.

قاعده‌ی ترکیبی پیشنهادی

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://yourdomain.com/$1 [L,R=301]

این قاعده، در یک ریدایرکت واحد، هم HTTPS را فعال می‌کند و هم www را حذف می‌کند. این ساختار، احتمال حلقه را به‌طور چشمگیری کاهش می‌دهد.

روش تشخیص htaccess معیوب

ساده‌ترین راه تشخیص این است که فایل .htaccess را موقتاً تغییر نام دهید. سپس سایت را در مرورگر باز کنید. اگر سایت باز شد (ولی با HTTP)، یعنی مشکل در همان فایل بوده. حالا می‌توانید قواعد را یکی‌یکی اضافه کنید تا مقصر پیدا شود.

siteurl و home در wp-config و دیتابیس

در وردپرس، دو مقدار siteurl و home تعیین می‌کنند که سایت در کدام آدرس سرو شود. اگر این دو مقدار با هم هماهنگ نباشند، حلقه ریدایرکت شکل می‌گیرد.

تفاوت siteurl و home

siteurl آدرس نصب هسته‌ی وردپرس است و home آدرس صفحه‌ی اصلی سایت. در اکثر سایت‌ها این دو یکسان هستند، ولی در بعضی تنظیمات خاص (مثل نصب وردپرس در زیرپوشه)، متفاوت می‌شوند.

اصلاح در wp-config.php

اگر پیشخوان وردپرس باز نمی‌شود، می‌توانید این مقادیر را مستقیماً در wp-config.php تنظیم کنید:

define('WP_HOME', 'https://yourdomain.com');
define('WP_SITEURL', 'https://yourdomain.com');

این تنظیمات، مقادیر دیتابیس را نادیده می‌گیرند و به‌عنوان راه‌حل موقت، می‌توانند حلقه را بشکنند. بعد از بازگرداندن دسترسی، باید مقادیر دیتابیس را هم به‌روز کنید.

اصلاح در دیتابیس

برای اصلاح مقادیر در دیتابیس، از phpMyAdmin یا خط فرمان MySQL استفاده کنید:

UPDATE wp_options SET option_value = 'https://yourdomain.com' WHERE option_name IN ('siteurl', 'home');

قبل از اجرای این کوئری، بکاپ کامل دیتابیس بگیرید. روش دقیق بکاپ‌گیری در پشتیبان‌گیری از سایت وردپرس باز شده است.

افزونه‌ها و قالب در حلقه ریدایرکت

افزونه‌ها و قالب، لایه‌ی بعدی ریشه‌های حلقه ریدایرکت هستند. در تجربه‌ی چندساله‌ام، این لایه بیشتر از همه نادیده گرفته می‌شود، چون ریشه در یک افزونه‌ی به‌ظاهر بی‌ربط پنهان است.

افزونه‌های مشکوک

سه دسته افزونه بیشتر از بقیه مشکوک هستند:

  1. افزونه‌های SSL و HTTPS: افزونه‌هایی مثل Really Simple SSL که ریدایرکت HTTPS را فعال می‌کنند، اگر با تنظیمات سرور هماهنگ نباشند، می‌توانند حلقه بسازند.
  2. افزونه‌های امنیتی: افزونه‌هایی مثل Wordfence که قواعد امنیتی در .htaccess اضافه می‌کنند، ممکن است با قواعد دیگر تضاد داشته باشند.
  3. افزونه‌های ریدایرکت: افزونه‌هایی مثل Redirection که ریدایرکت‌های سفارشی مدیریت می‌کنند، اگر قاعده‌ای متناقض اضافه کنند، حلقه می‌سازند.

روش تشخیص افزونه‌ی مقصر

روش حذف تدریجی، دقیق‌ترین راه است. در محیط استیجینگ، ابتدا تمام افزونه‌ها را غیرفعال کنید و سپس یکی‌یکی فعال کنید تا مقصر پیدا شود. روش دقیق این کار در پیدا کردن افزونه‌ی مشکل‌ساز وردپرس باز شده است.

قالب و کد سفارشی

اگر در functions.php قالب یا در یک افزونه‌ی سفارشی، تابع wp_redirect بدون شرط توقف تعریف شده باشد، سایت در حلقه می‌افتد. نمونه‌ی کد مشکل‌ساز:

function bad_redirect() {
    wp_redirect('https://yourdomain.com');
    exit;
}
add_action('template_redirect', 'bad_redirect');

این کد در هر بازدید، کاربر را به همان آدرس هدایت می‌کند و حلقه‌ی بی‌پایان می‌سازد. راه‌حل: اضافه کردن شرط توقف:

function safe_redirect() {
    if (is_admin() || is_front_page()) {
        return;
    }
    wp_redirect('https://yourdomain.com');
    exit;
}
add_action('template_redirect', 'safe_redirect');

مباحث مرتبط با ساختار قالب و کد سفارشی در قالب چایلد وردپرس باز شده است.

CDN و پراکسی معکوس

اگر سایت شما روی CDN مثل Cloudflare تنظیم شده باشد، لایه‌ی جدیدی از پیچیدگی اضافه می‌شود. CDN می‌تواند قواعد ریدایرکت خودش را اعمال کند که با سرور اصلی تضاد داشته باشد.

تنظیمات SSL در CDN

در Cloudflare، چهار حالت SSL وجود دارد: Flexible، Full، Full Strict و Origin Pull. اگر حالت Flexible باشد و سرور اصلی هم ریدایرکت HTTPS فعال داشته باشد، حلقه شکل می‌گیرد:

  1. کاربر درخواست HTTPS می‌کند.
  2. Cloudflare درخواست را به سرور اصلی با HTTP می‌فرستد (حالت Flexible).
  3. سرور اصلی ریدایرکت به HTTPS می‌دهد.
  4. Cloudflare دوباره درخواست را به سرور اصلی با HTTP می‌فرستد.
  5. حلقه شکل می‌گیرد.

راه‌حل: تغییر حالت SSL به Full یا Full Strict. مباحث مرتبط با CDN در نقش CDN در سرعت سایت باز شده است.

Page Rules در CDN

در Cloudflare، Page Rules اجازه می‌دهد قواعد ریدایرکت سفارشی تعریف کنید. اگر این قواعد با قواعد سرور هماهنگ نباشند، حلقه رخ می‌دهد. توصیه: تمام ریدایرکت‌های HTTPS و www را فقط در یک لایه (CDN یا سرور) تعریف کنید.

پراکسی معکوس در Nginx

در معماری‌های پیچیده‌تر، Nginx به‌عنوان پراکسی معکوس جلوی سرور اصلی قرار می‌گیرد. اگر Nginx ریدایرکت HTTPS تعریف کند و سرور اصلی هم ریدایرکت مشابه داشته باشد، ممکن است حلقه شکل بگیرد. راه‌حل: در سربرگ X-Forwarded-Proto مشخص کنید که لایه‌ی جلویی، HTTPS را مدیریت می‌کند.

حلقه ریدایرکت در ووکامرس و صفحات تسویه‌حساب

حلقه ریدایرکت می‌تواند در سایت‌های ووکامرسی به‌طور خاص مخرب باشد، چون صفحات تسویه‌حساب و سبد خرید را از دسترس خارج می‌کند و مشتریان نمی‌توانند خرید کنند.

سناریوهای خاص ووکامرس

سه سناریوی خاص که در فروشگاه‌های ووکامرس شایع‌تر هستند:

  1. ریدایرکت سبد خرید به تسویه‌حساب: اگر افزونه‌ای این ریدایرکت را فعال کند و صفحه‌ی سبد خرید هم به تسویه‌حساب هدایت شود، حلقه شکل می‌گیرد.
  2. ریدایرکت پس از ورود: اگر صفحه‌ی ورود، کاربران را به صفحه‌ی حساب و صفحه‌ی حساب، کاربران را به صفحه‌ی ورود هدایت کند، حلقه شکل می‌گیرد.
  3. صفحات نیازمند ورود: اگر صفحه‌ای نیازمند ورود باشد و کاربر را به صفحه‌ی ورود هدایت کند، ولی صفحه‌ی ورود هم نیازمند ورود باشد، حلقه رخ می‌دهد.

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

رفع حلقه در ووکامرس

راه‌حل استاندارد: بازبینی تنظیمات صفحات ووکامرس در مسیر ووکامرس > تنظیمات > پیشرفته. مطمئن شوید که هر صفحه (سبد خرید، تسویه‌حساب، حساب کاربری) به صفحه‌ی درست متصل است و هیچ‌کدام خودشان را به دیگری ریدایرکت نمی‌کنند.

شکستن حلقه و اولویت‌بندی

بعد از پیدا کردن ریشه، نوبت به شکستن حلقه می‌رسد. ترتیب اولویت‌بندی من در پروژه‌های واقعی:

  1. بازگردانی سریع دسترسی: اگر پیشخوان وردپرس هم باز نمی‌شود، از طریق FTP یا File Manager، تنظیمات siteurl و home را در wp-config.php اصلاح کنید.
  2. غیرفعال‌سازی افزونه‌ی مشکوک: اگر افزونه‌ی خاصی بعد از فعال‌سازی حلقه ساخته، پوشه‌ی آن را تغییر نام دهید.
  3. اصلاح htaccess: فایل .htaccess را با نسخه‌ی استاندارد وردپرس جایگزین کنید.
  4. اصلاح SSL: اگر ریشه در SSL است، گواهی را بررسی و در صورت لزوم تمدید کنید.
  5. بررسی CDN: اگر از CDN استفاده می‌کنید، حالت SSL را بررسی و در صورت لزوم تغییر دهید.
  6. مستندسازی: ریشه، روش تشخیص و راه‌حل را ثبت کنید. این یادداشت در بحران بعدی، ساعت‌ها زمان صرفه‌جویی می‌کند.

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

پایش مستمر و پیشگیری

بعد از شکستن حلقه، مهم‌تر از شکستن، پیشگیری است. پنج سطح پایش توصیه می‌کنم:

سطح اول: پایش دوره‌ای سایت

هفته‌ای یک‌بار، سایت را با curl تست کنید و تعداد ریدایرکت‌ها را بررسی کنید. اگر تعداد ریدایرکت‌ها به‌طور غیرعادی بالا رفت، ریشه را قبل از بحران پیدا کنید. مباحث مرتبط با این تست در بررسی خطاهای سرور در لاگ‌ها باز شده است.

سطح دوم: تست در محیط استیجینگ

هر تغییر در SSL، htaccess یا DNS را ابتدا در محیط استیجینگ تست کنید. این عادت ساده، از بحران‌های جدی جلوگیری می‌کند. مباحث مرتبط با محیط تست در روش تست قالب پیش از انتشار باز شده است.

سطح سوم: پایش خودکار ریدایرکت

سرویس‌های پایش مثل Uptime Robot می‌توانند تعداد ریدایرکت‌ها را پایش کنند. اگر تعداد از حد آستانه گذشت، هشدار می‌دهند.

سطح چهارم: بازبینی سبد افزونه‌ها

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

سطح پنجم: بکاپ منظم قبل از هر تغییر

قبل از هر تغییر در SSL، htaccess یا DNS، حتماً بکاپ کامل بگیرید. اگر تغییر باعث بحران شد، در چند ثانیه به نسخه‌ی سالم برگردید. مباحث مرتبط در پشتیبان‌گیری از سایت وردپرس باز شده است.

پرسش‌های پرتکرار درباره حلقه ریدایرکت وردپرس

آیا حلقه ریدایرکت می‌تواند ناشی از SSL نامعتبر باشد؟

بله. شایع‌ترین ریشه‌ی حلقه، ناسازگاری بین ریدایرکت HTTP به HTTPS و عدم سلامت گواهی SSL است. اگر گواهی منقضی یا زنجیره‌ی گواهی ناقص باشد، سرور درخواست HTTPS را رد می‌کند و به HTTP برمی‌گرداند که با قاعده‌ی ریدایرکت، حلقه می‌سازد.

چطور بفهمم حلقه از CDN است یا سرور اصلی؟

سریع‌ترین تست، دور زدن CDN است. با دستور curl -I --resolve yourdomain.com:443:server_ip https://yourdomain.com می‌توانید سایت را مستقیم از سرور اصلی تست کنید. اگر مستقیم پاسخ داد ولی از دامنه خطا آمد، ریشه در لایه‌ی CDN است.

آیا افزونه‌های SSL می‌توانند باعث حلقه شوند؟

بله. افزونه‌هایی مثل Really Simple SSL که ریدایرکت HTTPS را فعال می‌کنند، اگر با تنظیمات سرور هماهنگ نباشند، می‌توانند حلقه بسازند. راه‌حل: تنظیم ریدایرکت فقط در یک لایه (سرور یا افزونه)، نه در هر دو.

چرا بعد از تغییر دامنه، سایت در حلقه افتاده؟

سه دلیل رایج: مقادیر siteurl و home در دیتابیس به دامنه‌ی قدیمی اشاره می‌کنند، رکوردهای DNS به سرور قدیمی اشاره می‌کنند، یا قواعد htaccess به دامنه‌ی قدیمی ریدایرکت می‌دهند. بررسی هر سه مورد پس از تغییر دامنه ضروری است.

آیا حلقه ریدایرکت روی سئو تأثیر می‌گذارد؟

بله. گوگل نمی‌تواند صفحه‌ای که در حلقه است را ایندکس کند و به‌طور خودکار آن را از فهرست خارج می‌کند. اگر حلقه مدت‌زمان زیادی ادامه یابد، ترافیک ارگانیک افت می‌کند و رتبه‌ها پایین می‌آیند.

چطور از حلقه ریدایرکت در سایت‌های چندزبانه جلوگیری کنم؟

در سایت‌های چندزبانه، ریدایرکت بین زبان‌ها می‌تواند به حلقه منجر شود اگر با کوکی یا IP ناسازگار باشد. راه‌حل: ریدایرکت زبان را فقط یک بار در ابتدای بازدید اعمال کنید و از کوکی برای حفظ انتخاب زبان استفاده کنید.

آیا حلقه ریدایرکت در پیشخوان وردپرس هم رخ می‌دهد؟

بله، در مواردی که قواعد ریدایرکت روی مسیر /wp-admin اعمال شوند، ممکن است کاربر به‌طور مداوم بین صفحه‌ی لاگین و پیشخوان در حلقه بیفتد. راه‌حل: مسیر /wp-admin را از قواعد ریدایرکت مستثنی کنید.

آیا wp-config می‌تواند به‌تنهایی حلقه را بشکند؟

بله. اگر از طریق FTP به فایل wp-config.php دسترسی داشته باشید، می‌توانید با تعریف WP_HOME و WP_SITEURL به مقادیر درست، حلقه را بشکنید. این راه‌حل موقتی است ولی برای بازگرداندن دسترسی، مؤثر است.

آیا ریدایرکت‌های زنجیره‌ای هم باعث حلقه می‌شوند؟

خیر، زنجیره‌ی ریدایرکت (مسیر A به B، B به C) خودش حلقه نیست، ولی می‌تواند سرعت سایت را کاهش دهد. اگر در این زنجیره، یک ریدایرکت به آدرس اول برگردد، حلقه شکل می‌گیرد.

آیا حذف htaccess می‌تواند حلقه را بشکند؟

بله. اگر فایل .htaccess موقتاً تغییر نام داده شود، قواعد ریدایرکت در آن لایه غیرفعال می‌شوند. اگر حلقه شکست، ریشه در همان فایل بوده. بعد از این تست، باید فایل را بازسازی کنید و قواعد را یکی‌یکی اضافه کنید تا مقصر پیدا شود.

درس‌های میدانی از شکستن حلقه‌ی ریدایرکت

در پایان این مقاله، چند نکته‌ای را می‌گویم که در مستندات رسمی کم‌تر به آن‌ها اشاره می‌شود ولی در پروژه‌های واقعی بارها به کارم آمده:

نخست: هیچ‌گاه در بیش از یک لایه، ریدایرکت تعریف نکنید. شایع‌ترین ریشه‌ی حلقه ریدایرکت، تعریف یک قاعده‌ی ریدایرکت در چند لایه (htaccess، افزونه، CDN، قالب) است که هرکدام از دیدگاه خود درست هستند ولی با هم تضاد دارند. قاعده‌ی من: انتخاب یک لایه‌ی اصلی برای ریدایرکت، و باقی لایه‌ها فقط از همان پیروی کنند.

دوم: قبل از هر تغییر در SSL، htaccess یا DNS، حتماً بکاپ کامل بگیرید. اگر تغییر باعث حلقه شد، در چند ثانیه می‌توانید به نسخه‌ی سالم برگردید. تجربه‌ی من نشان داده که این عادت ساده، در نصف پروژه‌ها از بحران‌های طولانی جلوگیری کرده است. مباحث مرتبط در پشتیبان‌گیری از سایت وردپرس باز شده است.

سوم: ابزار curl را جدی بگیرید. این ابزار ساده، در بحران حلقه ریدایرکت، دقیق‌ترین اطلاعات را می‌دهد. با یک دستور ساده می‌توانید زنجیره‌ی کامل ریدایرکت‌ها را ببینید و مقصر را در چند ثانیه پیدا کنید. تجربه‌ی من نشان داده که سایت‌هایی که با curl تست منظم دارند، در بحران حلقه سریع‌تر واکنش نشان می‌دهند.

در تجربه‌ی چندساله‌ام روی سایت‌های وردپرسی، الگویی که بارها تکرار شده این است که حلقه ریدایرکت تقریباً همیشه در یکی از پنج لایه ریشه دارد: SSL، DNS، htaccess، افزونه یا CDN. تشخیص سریع این لایه، از هر راه‌حل آماده مؤثرتر است. اگر ابزارهای تشخیصی را در اختیار داشته باشید و لایه‌ها را به ترتیب بررسی کنید، این خطا از یک بحران ترسناک به یک تمرین روتین تبدیل می‌شود.

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