انتقال HTTP به HTTPS با کد .htaccess، یکی از پرتکرارترین و در عین حال حیاتی‌ترین اقدامات پس از نصب گواهی SSL است که اگر به‌درستی انجام نشود، می‌تواند به حلقه ریدایرکت، افت رتبه سئو و حتی قطعی سایت منجر شود. فایل .htaccess، یک فایل پیکربندی سرور Apache است که امکان تعریف قواعد ریدایرکت، بازنویسی URL و سایر تنظیمات سرور را فراهم می‌کند. در این مقاله، چارچوبی عملی و دقیق برای انتقال HTTP به HTTPS با استفاده از .htaccess ارائه می‌شود.

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

چرا از .htaccess برای ریدایرکت؟

  • کنترل دقیق بر ریدایرکت‌ها.
  • پشتیبانی گسترده در هاست‌های اشتراکی.
  • امکان تعریف قواعد شرطی.
  • انعطاف در ریدایرکت مسیرهای خاص.
  • سادگی پیکربندی.

فایل .htaccess چیست؟

فایل .htaccess یک فایل پیکربندی در سطح دایرکتوری است که در سرورهای Apache استفاده می‌شود و امکان تعریف قواعدی مانند ریدایرکت، بازنویسی URL و محدودسازی دسترسی را فراهم می‌کند.

محل فایل

  • ریشه سایت: /public_html/.htaccess
  • در وردپرس: به‌طور پیش‌فرض در ریشه نصب.
  • می‌تواند در زیرپوشه‌ها نیز وجود داشته باشد.

ریدایرکت پایه HTTP به HTTPS

ساده‌ترین قاعده ریدایرکت:

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

تفسیر خط به خط

  • RewriteEngine On: فعال‌سازی موتور Rewrite.
  • RewriteCond %{HTTPS} off: شرط اینکه HTTPS غیرفعال باشد.
  • RewriteRule ^(.*)$: هر مسیر درخواستی.
  • https://%{HTTP_HOST}%{REQUEST_URI}: مقصد ریدایرکت.
  • [L,R=301]: آخرین قاعده با کد 301.

ریدایرکت www و non-www

ریدایرکت به نسخه www

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

ریدایرکت به نسخه non-www

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

تفاوت 301 و 302

کدمعنیاثر بر سئو
301ریدایرکت دائمیانتقال کامل اعتبار
302ریدایرکت موقتانتقال ناقص اعتبار
307ریدایرکت موقت (با حفظ متد)مشابه 302
308ریدایرکت دائمی (با حفظ متد)مشابه 301

برای انتقال HTTP به HTTPS، همیشه از 301 استفاده کنید.

نمونه کامل .htaccess

# BEGIN Redirect HTTP to HTTPS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END Redirect HTTP to HTTPS

ترکیب HTTPS + www

برای اجبار هر دو (HTTPS و www):

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

پیکربندی پشت Proxy و CDN

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

راهکار استفاده از هدر X-Forwarded-Proto

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

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

ریدایرکت مسیرهای خاص

ریدایرکت یک صفحه خاص

Redirect 301 /old-page/ https://example.com/new-page/

ریدایرکت دامنه قدیمی به جدید

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

افزودن هدرهای امنیتی

<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

HSTS در .htaccess

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>

نکته: فعال‌سازی HSTS باید تدریجی باشد. شروع با max-age کوچک و افزایش تدریجی.

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

فایل .htaccess وردپرس، به‌طور پیش‌فرض قواعد خود را دارد. قواعد ریدایرکت HTTPS باید پیش از قواعد وردپرس قرار گیرند.

ساختار توصیه‌شده

  1. قواعد ریدایرکت HTTPS.
  2. قواعد وردپرس.
  3. هدرهای امنیتی.

رفع مشکلات رایج

مشکل: حلقه ریدایرکت

  • بررسی تنظیمات SSL در CDN (Full Strict).
  • پرهیز از ریدایرکت تکراری.
  • بررسی wp-config.php.

مشکل: سایت با خطای 500

  • بررسی سینتکس .htaccess.
  • غیرفعال‌سازی موقت قواعد برای شناسایی خطا.
  • مشاوره با پشتیبانی هاست.

مشکل: هیچ تغییری اعمال نمی‌شود

  • بررسی فعال بودن mod_rewrite.
  • بررسی AllowOverride در پیکربندی Apache.
  • پاک‌سازی کش مرورگر و CDN.

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

  • استفاده از 301 به‌جای 302.
  • قرار دادن قواعد ریدایرکت HTTPS در ابتدای فایل.
  • پرهیز از ریدایرکت‌های تکراری.
  • پاک‌سازی کش پس از تغییرات.
  • بکاپ از .htaccess پیش از تغییر.
  • تست در حالت Incognito.
  • فعال‌سازی HSTS به‌صورت تدریجی.
«.htaccess، قدرتمند است اما حساس؛ یک خطای کوچک در آن، سایت را از کار می‌اندازد.»

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

اشتباهاثر عملیاتی
استفاده از 302 به‌جای 301عدم انتقال اعتبار
نبود بکاپ پیش از تغییرعدم بازگشت
ریدایرکت تکراریحلقه ریدایرکت
نادیده گرفتن CDNتضاد پیکربندی
خطای سینتکسخطای 500
نبود تست پس از تغییراتخطاهای پنهان
فعال‌سازی HSTS پیش از تثبیتمسدود شدن سایت
نادیده گرفتن www و non-wwwمحتوای تکراری
عدم پاک‌سازی کشعدم اعمال تغییرات
نبود مستندسازیسردرگمی در آینده

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

چگونه HTTP را با .htaccess به HTTPS منتقل کنم؟

با افزودن قواعد RewriteEngine، RewriteCond و RewriteRule با کد 301.

تفاوت 301 و 302 چیست؟

301 ریدایرکت دائمی و 302 موقت. برای انتقال HTTP به HTTPS، همیشه از 301 استفاده کنید.

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

ممکن است mod_rewrite غیرفعال باشد، AllowOverride تنظیم نشده باشد یا قواعد تکراری وجود داشته باشد.

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

با بررسی تنظیمات CDN، پرهیز از ریدایرکت تکراری و یکسان‌سازی URL در wp-config.php.

آیا HSTS در .htaccess ایمن است؟

بله، اما باید به‌صورت تدریجی و پس از تثبیت کامل HTTPS فعال شود.

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

خیر، Nginx از .htaccess پشتیبانی نمی‌کند و باید قواعد در فایل پیکربندی سرور تعریف شوند.

چگونه CDN را با .htaccess هماهنگ کنم؟

با استفاده از هدر X-Forwarded-Proto و تنظیم حالت SSL روی Full Strict در CDN.

آیا ریدایرکت بر سئو اثر دارد؟

بله. ریدایرکت 301 باعث انتقال اعتبار لینک می‌شود و رتبه سایت را حفظ می‌کند.

پایان‌بندی

انتقال HTTP به HTTPS با .htaccess، یکی از بنیادی‌ترین اقدامات پس از نصب SSL است که با رعایت اصول دقیق، به یک فرآیند روان و بی‌دردسر تبدیل می‌شود. ریدایرکت 301، پیکربندی صحیح www و non-www، و رفع مشکلات رایج، بخشی از این فرآیند است.

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

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

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