انتقال HTTP به HTTPS با کد .htaccess
انتقال HTTP به HTTPS با کد .htaccess: بررسی دقیق سینتکس، مثالهای عملی، تفاوت 301 و 302 و رفع خطاهای رایج ریدایرکت.
انتقال 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 باید پیش از قواعد وردپرس قرار گیرند.
ساختار توصیهشده
- قواعد ریدایرکت HTTPS.
- قواعد وردپرس.
- هدرهای امنیتی.
رفع مشکلات رایج
مشکل: حلقه ریدایرکت
- بررسی تنظیمات 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 داشتهاید، تجربهتان را در دیدگاهها بنویسید. 🔒