دسته بندی:

ریدایرکت ۳۰۱ دامنه٬ بهترین نوع ریدایرکت منطبق بر قوانین سئو

ریدایرکت ۳۰۱ یعنی «این نشانی برای همیشه به آدرس جدید منتقل شده است»؛ همین پیامِ دائمی‌بودن باعث می‌شود موتورهای جستجو آدرس قدیمی را با آدرس تازه جایگزین کنند و اعتبار و سیگنال‌های رتبه را روی مقصد جمع کنند. به همین دلیل برای هر تغییر همیشگیِ آدرس (انتقال دامنه، تغییر ساختار لینک‌ها، ادغام دو صفحه، یا یکسان‌سازی www و HTTPS) انتخاب درست ۳۰۱ است و بهتر است در سطح سرور انجام شود، نه با جاوااسکریپت یا تگ meta refresh.

در ریدایرکت ۳۰۱ دقیقاً چه اتفاقی می‌افتد

سرور به‌جای بازگرداندن محتوای صفحه، پاسخی با کد وضعیت 301 Moved Permanently و هدر Location می‌فرستد که نشانی مقصد را مشخص می‌کند. مرورگر بی‌درنگ درخواست تازه‌ای به آن نشانی می‌فرستد و کاربر به‌جای صفحه خطای ۴۰۴، محتوای درست را می‌بیند. خزنده هم همین مسیر را دنبال می‌کند، با این تفاوت که پیام «دائمی» را ثبت می‌کند: نشانی قدیمی کنار گذاشته می‌شود و نسخه جدید جای آن را در فهرست می‌گیرد.

سه موقعیت رایج که ارزش این کد را نشان می‌دهد:

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

تفاوت ۳۰۱، ۳۰۲، ۳۰۷ و ۳۰۸

هر چهار کد کاربر را جابه‌جا می‌کنند، اما پیام‌شان به موتور جستجو و رفتارشان با متد درخواست یکسان نیست:

کد ماهیت رفتار با متد درخواست کاربرد درست
301 دائمی ممکن است POST به GET تبدیل شود هر تغییر همیشگی نشانی
302 موقت ممکن است POST به GET تبدیل شود صفحه‌ای که واقعاً بازمی‌گردد، تست A/B
307 موقت متد و بدنه درخواست حفظ می‌شود ریدایرکت موقت روی فرم‌ها و API
308 دائمی متد و بدنه درخواست حفظ می‌شود معادل دقیق‌تر ۳۰۱ برای درخواست‌های غیر GET

نکته عملی این است: کدهای موقت به موتور جستجو می‌گویند نشانی اصلی همان قدیمی است و باید در فهرست بماند. اگر برای یک تغییر همیشگی از ۳۰۲ استفاده کنید، عملاً گفته‌اید «فعلاً چیزی را عوض نکن». درست است که یک ریدایرکت موقتِ ماندگار ممکن است در نهایت مثل دائمی تفسیر شود، اما تکیه بر این حدس ریسک بی‌دلیلی است. در سمت مقابل، ۳۰۸ از نظر سئو هم‌ارز ۳۰۱ است و مزیتش حفظ متد درخواست است؛ برای صفحات معمولی سایت، ۳۰۱ همچنان رایج‌ترین و سازگارترین گزینه با ابزارها و افزونه‌هاست.

یکسان‌سازی www و HTTPS؛ پایه‌ای‌ترین ریدایرکت هر سایت

اگر سایت شما هم‌زمان با http:// و https:// و هم با www و هم بدون آن باز شود، عملاً چهار نسخه از یک صفحه دارید و موتور جستجو باید حدس بزند کدام اصل است. راه‌حل، انتخاب یک نسخه رسمی و هدایت دائمی سه نسخه دیگر به آن است.

روی وب‌سرور آپاچی (و LiteSpeed که همین فایل را می‌خواند) قواعد در فایل .htaccess داخل پوشه public_html نوشته می‌شود. در سرویس‌های میزبانی وب که با کنترل‌پنل سی‌پنل ارائه می‌شوند، این فایل از بخش مدیریت فایل کنترل‌پنل قابل ویرایش است. پیش از هر تغییر یک نسخه پشتیبان بگیرید، چون یک قاعده اشتباه می‌تواند کل سایت را با خطای ۵۰۰ یا حلقه بی‌پایان از دسترس خارج کند:

  • cp .htaccess .htaccess.bak

سپس این قاعده را در ابتدای فایل قرار دهید تا هر دو کار (HTTPS و حذف www) در یک پرش انجام شود:

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

به‌جای example.com دامنه خودتان را بگذارید. استفاده از [OR] عمدی است و شرط‌ها را «یا» می‌کند: به این ترتیب هر سه نسخه غیررسمی (بدون HTTPS، با www، یا هر دو) در یک پرش به نشانی اصلی می‌رسند. اگر [OR] را بردارید، دو شرط با «و» ترکیب می‌شوند و قاعده فقط برای نشانی http://www اجرا می‌شود؛ یعنی نسخه بدون www روی HTTP و نسخه www روی HTTPS اصلاً هدایت نمی‌شوند. اگر هم به‌جای این ساختار دو قاعده جداگانه بنویسید (یکی برای HTTPS و یکی برای حذف www)، بازدیدکننده‌ای که با http://www وارد می‌شود دو بار ریدایرکت می‌خورد.

ریدایرکت یک صفحه یا کل دامنه

برای یک نشانی مشخص، ساده‌ترین شکل استفاده از ماژول mod_alias است:

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

و برای انتقال کل دامنه با حفظ ساختار مسیرها:

  • RewriteEngine On
  • RewriteRule ^(.*)$ https://newdomain.ir/$1 [R=301,L]

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

ریدایرکت در Nginx

در Nginx قاعده‌ای مشابه .htaccess وجود ندارد و تنظیمات در فایل کانفیگ سرور نوشته می‌شود؛ فهرست کارهایی که این فایل در آپاچی بر عهده دارد در کاربردهای فایل htaccess آمده است. الگوی استاندارد این است که درخواست‌های HTTP در یک بلاک جداگانه گرفته و یکجا به نسخه رسمی هدایت شوند:

  • server {
  • listen 80;
  • server_name example.com www.example.com;
  • return 301 https://example.com$request_uri;
  • }

این بلاک هر درخواست HTTP را، چه با www و چه بدون آن، در یک پرش به نشانی رسمی می‌رساند؛ برای اینکه نسخه www روی HTTPS هم یکسان‌سازی شود، باید همین return در بلاک TLS مربوط به www.example.com هم تعریف شود. توجه کنید که اجبار HTTPS، چه در آپاچی و چه در Nginx، فقط زمانی درست کار می‌کند که گواهی SSL معتبری روی دامنه نصب شده باشد؛ در غیر این صورت کاربر به‌جای سایت، هشدار امنیتی مرورگر را می‌بیند.

و برای یک مسیر خاص داخل بلاک اصلی:

  • location = /old-page.html { return 301 /new-page/; }

از دستور rewrite ... permanent فقط وقتی استفاده کنید که واقعاً به الگوی منظم نیاز دارید؛ return سبک‌تر و خواناتر است. پیش از اعمال، صحت کانفیگ را بررسی و سپس سرویس را ری‌لود کنید تا اتصال‌های باز قطع نشوند:

  • nginx -t
  • systemctl reload nginx

زنجیره و حلقه ریدایرکت؛ دو اشتباه پرهزینه

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

زنجیره ریدایرکت در برابر ریدایرکت مستقیمزنجیره: چهار رفت و برگشت تا رسیدن⁦http://site⁩⁦http://www⁩⁦https://www⁩⁦https://site⁩⁦301 -> 301 -> 301⁩هر پرش زمان اضافه می‌کند و خطای پیکربندی را پنهان می‌کندمستقیم: یک پرش تا آدرس نهایی⁦http://site⁩⁦https://site⁩⁦301⁩همه حالت‌های ورودی را در یک قانون به نسخه نهایی بفرستیدو نسخه نهایی را در تگ canonical هم تکرار کنیدزنجیره فقط کند نیست؛ خطاهای پیکربندی را هم پنهان می‌کند،چون هر پرش ایراد پرش قبلی را جبران می‌کند و شما متوجهنمی‌شوید. حلقه ریدایرکت هم همین‌جا ساخته می‌شود: دو قانونکه هرکدام مقصد دیگری را دوباره ریدایرکت می‌کند و مرورگردر نهایت با خطای «ریدایرکت بیش از حد» متوقف می‌شود

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

حلقه هم زمانی رخ می‌دهد که دو قاعده یکدیگر را خنثی کنند؛ مثلاً یک قاعده در .htaccess بدون www را به www می‌فرستد و هم‌زمان تنظیمات سیستم مدیریت محتوا عکس آن را انجام می‌دهد. در وردپرس این حالت با پیام Too Many Redirects دیده می‌شود که در خطاهای رایج وردپرس هم به آن پرداخته‌ایم. نتیجه، خطای «تعداد ریدایرکت‌ها بیش از حد مجاز» در مرورگر است. برای پیشگیری، ریدایرکت اصلی سایت را فقط در یک لایه تعریف کنید: یا وب‌سرور، یا افزونه، نه هر دو.

بعد از پیاده‌سازی چه چیزی را بررسی کنیم

با curl می‌توانید کل مسیر و کد هر پرش را ببینید و مطمئن شوید تعداد پرش‌ها بیش از یکی نیست:

  • curl -sIL https://example.com/old-page

برای نگاهی کلی‌تر و بدون نیاز به خط فرمان، ابزار بررسی سلامت سایت زنجیره ریدایرکت، سازگاری نسخه www و بدون www و هدایت خودکار HTTP به HTTPS را گزارش می‌کند و برای بازبینی سریع بعد از هر تغییر مناسب است.

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