چرا ریدایرکت HTTPS در .htaccess کار نمی‌کند، یکی از پرتکرارترین مشکلاتی است که توسعه‌دهندگان وردپرس و مدیران سایت‌ها با آن روبرو می‌شوند. تنظیم ریدایرکت HTTP به HTTPS از طریق .htaccess، در تئوری یک عملیات ساده است اما در عمل، دلایل متعددی می‌توانند باعث شکست آن شوند: از سینتکس نادرست و نبود mod_rewrite تا پیکربندی اشتباه CDN، کش معیوب و تنظیمات متناقض در wp-config.php. در این مقاله، چارچوبی عملی برای شناسایی و اصلاح مشکلات ریدایرکت HTTPS در .htaccess ارائه می‌شود.

در پروژه‌های متعدد وردپرسی، دیده‌ام که عیب‌یابی ریدایرکت HTTPS، نیازمند رویکردی سیستماتیک است که از شناسایی گلوگاه آغاز می‌شود.

چرا ریدایرکت HTTPS کار نمی‌کند؟

  • نبود mod_rewrite در سرور.
  • AllowOverride غیرفعال.
  • خطای سینتکس در .htaccess.
  • ترتیب نادرست قواعد.
  • قواعد تکراری.
  • تضاد با CDN.
  • نبود هدر X-Forwarded-Proto.
  • کش معیوب.
  • تنظیمات متناقض wp-config.php.
  • مجوز نادرست فایل .htaccess.

نشانه‌های ریدایرکت کارنکرده

  • دسترسی سایت همچنان با HTTP.
  • عدم انتقال خودکار به HTTPS.
  • نمایش هشدار امنیتی در مرورگر.
  • دسترسی به پنل مدیریت با HTTP.
  • حلقه ریدایرکت.
  • خطای 500 Internal Server Error.
  • ترافیک بدون تغییر در Search Console.

mod_rewrite غیرفعال

mod_rewrite، ماژول Apache است که برای ریدایرکت و Rewrite ضروری است. اگر غیرفعال باشد، .htaccess کار نمی‌کند.

بررسی فعال بودن

  • در cPanel: Apache Modules.
  • در SSH: apache2ctl -M | grep rewrite
  • در پنل هاست: بخش ماژول‌های Apache.

فعال‌سازی

sudo a2enmod rewrite
sudo systemctl restart apache2

AllowOverride

اگر AllowOverride در پیکربندی Apache روی None تنظیم شده باشد، .htaccess نادیده گرفته می‌شود.

بررسی

در /etc/apache2/apache2.conf یا پیکربندی سایت:

<Directory /var/www/>
AllowOverride All
</Directory>

خطای سینتکس

سینتکس نادرست، شایع‌ترین دلیل کار نکردن .htaccess است.

مثال‌های اشتباه

RewriteCond %{HTTPS} = off (اشتباه)

RewriteCond %{HTTPS} off (درست)

RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301] (اشتباه، نبود اسلش)

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301] (درست)

ترتیب قواعد

ترتیب قواعد در .htaccess اهمیت بالایی دارد. قواعد ریدایرکت HTTPS باید پیش از قواعد وردپرس قرار گیرند.

ترتیب صحیح

  1. RewriteEngine On.
  2. قواعد ریدایرکت HTTPS.
  3. قواعد وردپرس.

قواعد تکراری

وجود ریدایرکت تکراری در چند جا (htaccess + wp-config + CDN) به حلقه ریدایرکت منجر می‌شود.

بررسی منابع تکراری

  • فایل .htaccess ریشه و زیرپوشه‌ها.
  • افزونه‌های ریدایرکت (Redirection، Really Simple SSL).
  • تنظیمات CDN.
  • پیکربندی سرور.
  • تنظیمات wp-config.php.

تضاد با CDN

در Cloudflare و سایر CDNها، اگر حالت SSL روی Flexible باشد، ممکن است به حلقه ریدایرکت منجر شود.

راهکار

  • تنظیم SSL روی Full (Strict).
  • فعال‌سازی Always Use HTTPS در CDN.
  • فعال‌سازی Automatic HTTPS Rewrites.
  • Purge Cache پس از تغییرات.

هدر X-Forwarded-Proto

در محیط‌های پشت Proxy، %{HTTPS} ممکن است همیشه off باشد چون اتصال بین CDN و سرور HTTP است.

راهکار

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

توجه: این هدر تنها اگر توسط CDN تنظیم شده باشد، قابل اعتماد است.

کش و تأخیر اعمال

  • پاک‌سازی کش مرورگر.
  • پاک‌سازی کش CDN.
  • پاک‌سازی کش افزونه وردپرس.
  • تست در حالت Incognito.

تنظیمات wp-config.php

بررسی تنظیمات متناقض:

define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );
define( 'FORCE_SSL_ADMIN', true );

مجوز فایل .htaccess

  • مجوز فایل: ۶۴۴
  • مجوز پوشه: ۷۵۵
  • مالکیت: کاربر وب‌سرور.

پیکربندی سرور

  • بررسی Virtual Host.
  • بررسی SSL Module.
  • بررسی موقعیت .htaccess.
  • بررسی وجود .htaccess تکراری در زیرپوشه.

گام‌های عیب‌یابی

  1. بررسی سینتکس .htaccess.
  2. بررسی فعال بودن mod_rewrite.
  3. بررسی AllowOverride.
  4. بررسی تنظیمات CDN.
  5. بررسی wp-config.php.
  6. پاک‌سازی کش چندلایه.
  7. تست با URLهای مختلف.
  8. بررسی لاگ Apache.

اصلاحات عملی

اصلاح ۱: کد استاندارد

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

اصلاح ۲: پشت CDN

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

اصلاح ۳: رفع حلقه ریدایرکت

بررسی و حذف ریدایرکت‌های تکراری در CDN یا wp-config.php.

رویکردهای توصیه‌شده

  • بکاپ از .htaccess پیش از تغییر.
  • تست در محیط آزمایشگاهی.
  • بررسی فعال بودن mod_rewrite.
  • پرهیز از ریدایرکت تکراری.
  • پاک‌سازی کش پس از تغییرات.
  • تست با مرورگرهای مختلف.
  • مستندسازی تغییرات.
«.htaccess، زمانی کار می‌کند که همه اجزای زنجیره با هم هماهنگ باشند؛ یک لایه ناهماهنگ، کل زنجیره را می‌شکند.»

اشتباهات رایج

اشتباهاثر عملیاتی
سینتکس نادرستخطای 500
عدم بررسی mod_rewriteبی‌اثر بودن .htaccess
AllowOverride Noneنادیده گرفتن .htaccess
ریدایرکت تکراریحلقه ریدایرکت
تضاد CDNتضاد پیکربندی
نبود هدر X-Forwarded-Protoعدم کارکرد در Proxy
عدم پاک‌سازی کشمحتوای قدیمی
استفاده از 302عدم انتقال اعتبار
عدم تست پس از تغییرخطاهای پنهان
نبود مستندسازیسردرگمی

پرسش‌های پرتکرار

چرا ریدایرکت HTTPS در .htaccess کار نمی‌کند؟

دلایل متعدد: نبود mod_rewrite، AllowOverride None، سینتکس نادرست، تضاد با CDN، یا کش معیوب.

چگونه mod_rewrite را فعال کنم؟

در cPanel → Apache Modules یا در SSH با a2enmod rewrite.

AllowOverride چیست؟

تنظیمی در Apache که تعیین می‌کند .htaccess اجازه اجرای چه قواعدی را دارد.

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

با بررسی همه لایه‌ها (htaccess، wp-config، CDN، افزونه) و حذف قواعد تکراری.

چگونه ریدایرکت را در Cloudflare پیکربندی کنم؟

با تنظیم SSL روی Full Strict و فعال‌سازی Always Use HTTPS.

آیا .htaccess روی Nginx کار می‌کند؟

خیر، Nginx از .htaccess پشتیبانی نمی‌کند.

چرا خطای 500 پس از تغییر .htaccess رخ می‌دهد؟

به دلیل خطای سینتکس یا ریدایرکت بی‌نهایت. با بکاپ بازگردانید.

چگونه مطمئن شوم ریدایرکت به‌درستی کار می‌کند؟

با ابزارهایی مانند curl -I http://example.com و بررسی کد 301 و مقصد HTTPS.

پایان‌بندی

رفع مشکل ریدایرکت HTTPS در .htaccess، نیازمند رویکردی سیستماتیک است که از شناسایی دقیق گلوگاه آغاز می‌شود. با بررسی mod_rewrite، AllowOverride، سینتکس، ترتیب قواعد، CDN و کش، می‌توان این مشکل را به‌طور کامل برطرف کرد.

از منظر مهندسی سطح ارشد، سه اصل در عیب‌یابی ریدایرکت HTTPS تعیین‌کننده است: بکاپ از .htaccess پیش از تغییر، بررسی همه لایه‌ها به‌صورت موازی، و پایش مستمر پس از اصلاح.

برای درک عمیق‌تر، مقاله انتقال HTTP به HTTPS با کد .htaccess و مقاله چرا ریدایرکت HTTPS در .htaccess کار نمی‌کند و اصلاح آن را مطالعه کنید.

اگر در پروژه‌های خود تجربه‌ای از عیب‌یابی .htaccess داشته‌اید، تجربه‌تان را در دیدگاه‌ها بنویسید. 🔧