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

راه‌حل کلی دو بخش دارد: برای آدرسی که صفحه‌ی جایگزین دارد، ریدایرکت ۳۰۱ بگذارید؛ برای آدرسی که واقعاً تمام شده، صفحه‌ی ۴۰۴ مفیدی نشان بدهید.

کدهای وضعیت به زبان ساده#

کدمعناکاربرد
۲۰۰صفحه سالم استحالت عادی
۳۰۱انتقال دائمیآدرس برای همیشه عوض شد
۳۰۲انتقال موقتتبلیغ، آزمایش یا تعمیر موقت
۴۰۴یافت نشدصفحه وجود ندارد
۴۱۰برای همیشه رفتهحذف عمدی، بدون جایگزین

ریدایرکت ۳۰۱ اعتبار آدرس قدیمی را تا حد زیادی به آدرس جدید منتقل می‌کند؛ پس هر جا آدرس عوض شد، ۳۰۱ بهترین ابزار است.

راه اول: افزونه#

اگر کدنویسی نمی‌خواهید، افزونه‌های ریدایرکت‌ساز (یا بخش ریدایرکت افزونه‌ی سئویی که دارید) ساده‌ترین راه‌اند: آدرس قدیمی، آدرس جدید و نوع ریدایرکت را وارد می‌کنید. بعضی هم ۴۰۴ ها را ثبت می‌کنند و فهرست پربازدیدترین‌ها را نشان می‌دهند. این راه برای چند ده قاعده عالی است؛ برای هزاران قاعده، سرور سریع‌تر است.

راه دوم: htaccess (Apache)#

روی هاست‌هایی که Apache دارند، قواعد ریدایرکت را در .htaccess و بالای بلوک # BEGIN WordPress بگذارید تا وردپرس قبل از آن‌ها دخالت نکند. قبل از ویرایش از فایل نسخه‌ی پشتیبان بگیرید؛ یک غلط تایپی می‌تواند کل سایت را به خطای ۵۰۰ ببرد.

Apache
# یک آدرس به آدرس دیگر
Redirect 301 /old-page/ https://example.com/new-page/

# الگو: /blog/year/slug به /slug
RedirectMatch 301 ^/blog/[0-9]{4}/(.+)$ https://example.com/$1

بعد با مرورگر یا curl -I وضعیت را بررسی کنید:

Bash
curl -I https://example.com/old-page/

باید 301 و سرآیند location ببینید. اگر وب‌سرورتان Nginx است، قواعد معادل را در پیکربندی سرور می‌گذارند، نه .htaccess؛ از پشتیبانی هاست بپرسید.

راه سوم: کد در وردپرس#

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

PHP
add_action( 'template_redirect', function () {
	if ( ! is_404() ) {
		return;
	}

	$uri  = isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : '';
	$path = wp_parse_url( $uri, PHP_URL_PATH );
	$path = untrailingslashit( rawurldecode( (string) $path ) );

	$map = array(
		'/old-page' => '/new-page/',
		'/خدمات'    => '/services/',
	);

	if ( isset( $map[ $path ] ) ) {
		wp_safe_redirect( home_url( $map[ $path ] ), 301 );
		exit;
	}
} );

چند نکته: rawurldecode لازم است چون مرورگر آدرس فارسی را کدگذاری‌شده می‌فرستد. wp_safe_redirect فقط به همین سایت می‌رود و از ریدایرکت‌های باز جلوگیری می‌کند. و وردپرس تغییر نامک نوشته را خودش حفظ می‌کند (آدرس قدیمی را به جدید می‌فرستد)؛ پس این کد برای آدرس‌هایی است که فراتر از آن تغییر کرده‌اند.

پیدا کردن ۴۰۴ های واقعی#

نباید کورکورانه ریدایرکت بگذارید. اول بدانید کدام آدرس‌ها مشکل دارند:

  1. در Google Search Console، بخش صفحات (Pages) دلیل «یافت نشد (۴۰۴)» را ببینید.
  2. لاگ دسترسی هاست یا ثبت ۴۰۴ افزونه‌ها را بررسی کنید.
  3. با یک خزنده‌ی سایت (crawler) لینک‌های خراب داخلی را پیدا کنید.
  4. لینک‌هایی که از سایت‌های دیگر آمده و ۴۰۴ می‌شوند را اولویت بدهید.

لینک‌های داخلی خراب را در خود مقاله اصلاح کنید و برای باقی ریدایرکت بگذارید. این کار بخشی از سئوی محتوایی وردپرس هم هست.

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

  • زنجیره‌ی ریدایرکت: A به B و B به C. مستقیم A به C بدهید.
  • حلقه: دو قاعده که یکدیگر را صدا می‌زنند؛ مرورگر خطای «ریدایرکت بیش از حد» می‌دهد.
  • ریدایرکت همه‌چیز به صفحه‌ی اصلی: تجربه‌ی بد و معمولاً soft 404.
  • فراموش‌کردن http و https یا با و بدون www: نسخه‌های سایت را یکی کنید.
  • ۳۰۲ به‌جای ۳۰۱ برای تغییر دائمی.

صفحه‌ی ۴۰۴ مفید#

برای آدرس‌های واقعاً از‌دست‌رفته، قالب ۴۰۴ خوب لازم دارید: پیام روشن، کادر جستجو، لینک به صفحه‌ی اصلی و پربازدیدترین مقاله‌ها، و البته کد وضعیت واقعی ۴۰۴ (نه ۲۰۰). در قالب کلاسیک فایل 404.php را ویرایش کنید؛ در قالب بلوکی، از ویرایشگر سایت قالب «۴۰۴» را بسازید. این‌ها را در قالب‌های بلوکی و ویرایشگر سایت ببینید. یادتان باشد پیش از تغییر قواعد بزرگ، بکاپ بگیرید: بکاپ خودکار وردپرس.

ریدایرکت بعد از تغییر ساختار پیوندها#

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

اگر سایت دامنه‌ی تازه دارد، ریدایرکت ۳۰۱ از هر آدرس قدیمی به آدرس همتای آن در دامنه‌ی جدید لازم است، نه فقط از صفحه‌ی اصلی. بعد در Search Console «تغییر آدرس» را برای دامنه‌ی قدیمی ثبت کنید و دست‌کم چند ماه ریدایرکت‌ها را نگه دارید. برداشتن زودهنگام ریدایرکت‌ها، لینک‌های بیرونی و اعتبار صفحه را هدر می‌دهد.

کش را هم یادتان نرود#

ریدایرکت‌های ۳۰۱ را مرورگرها و CDN ها کش می‌کنند. یعنی اگر قاعده‌ی اشتباهی گذاشتید و بعد اصلاحش کردید، ممکن است خودتان هنوز نتیجه‌ی قدیمی را ببینید. برای آزمایش از پنجره‌ی ناشناس یا curl -I استفاده کنید و کش افزونه‌ها و CDN را پاک کنید. اگر مطمئن نیستید ریدایرکت درست است، اول با ۳۰۲ امتحان کنید و بعد به ۳۰۱ تغییر دهید.

خلاصه#

  • برای آدرس عوض‌شده‌ی دائمی ۳۰۱ بگذارید؛ ۳۰۲ فقط برای انتقال موقت.
  • ریدایرکت را با افزونه، .htaccess (بالای بلوک وردپرس) یا کد template_redirect انجام دهید.
  • پیش از ویرایش .htaccess پشتیبان بگیرید و با curl -I نتیجه را بسنجید.
  • ۴۰۴ های مهم را با Search Console، لاگ و خزنده پیدا کنید.
  • زنجیره، حلقه و ریدایرکت همه‌چیز به صفحه‌ی اصلی را نکنید.
  • صفحه‌ی ۴۰۴ سفارشی با کد وضعیت ۴۰۴ واقعی و جستجو بسازید.