Як налаштувати 301 редирект у WordPress

Привіт:) У цьому пості покажу, як налаштувати 301 редирект у WordPress, щоб перенаправити користувача або пошукового робота з однієї сторінки сайту на іншу.

Що таке 301 редирект та навіщо потрібен

Технічно — це автоматична заміна однієї заданої URL-адреси на іншу. Наприклад, якщо у браузері відвідувач або пошуковий бот запитує сторінку https://site.com/page-1, то в результаті йому буде видана https://site.com/page-2.

Зазвичай використовується, якщо:

  • було перейменовано розділ сайту та змінено його адресу;
  • змінився домен;
  • хочете перенести контент на нову сторінку;
  • потрібно зробити переадресацію всіх сторінок на HTTPS, www або без www;
  • необхідно перенаправити відвідувача за партнерським посиланням;
  • є бажання змінити постійну адресу сторінки входу до адмін-панелі;
  • змінилася структура постійних посилань;
  • йде розробка складних форм.
до змісту ↑

Типи редиректів

  • 301 — сторінка перенесена назавжди і має постійну нову URL-адресу.
  • 302 — тимчасове переміщення (наприклад, переадресація на технічну сторінку під час проведення робіт з обслуговування ресурсу).
Якщо нова адреса більше не буде змінюватися, використовуйте статус 301.
Постійні редиректи "запам'ятовуються" браузерами та пошуковими системами довше, ніж тимчасові. Тому якщо прибрати перенаправлення, то браузер все ще його виконуватиме. Якщо не допомагає повне очищення кешу та кукі, то рекомендую перевстановити браузер.
до змісту ↑

Важливість редиректів для SEO

  • 301 редирект передає всю вагу на кінцеву сторінку. Тобто відбувається "склеювання" старої сторінки з новою.
  • 302 взагалі не передає вагу. Таке перенаправлення — найкращий спосіб для тимчасових сторінок, коли сайт недоступний для перегляду відвідувачами (наприклад, "Технічне обслуговування"). "Перекинути" користувача або пошукового робота можна різними способами. Покажу декілька для різних випадків.
Перед всіма наступними діями рекомендую створити повну резервну копію WordPress-сайту.
до змісту ↑

Як виконати довільний 301 редирект WordPress у PHP-коді теми або плагіну

function mp_redirects_callback() {
	if ( is_page( 21 ) ) {
		wp_redirect( "https://site.com/", 301 );
		exit();
	}
}
add_action( 'template_redirect', 'mp_redirects_callback' );

У коді виконується наступна перевірка: якщо відкрита сторінка, унікальний ідентифікатор (ID) якої рівний 21, то система автоматично перенаправляє на сторінку сайту https://site.com/. Обидва значення замініть на свої.

Наведу приклад універсального редиректу — перенаправлення в межах поточного сайту та на зовнішні посилання. У коді виконується перевірка за ключем "new". Якщо значення починається із "http://" або "https://", то виконується зовнішній редирект. Якщо ні, то внутрішній, головна адреса сайту береться за допомогою функції site_url().

function mpIsStart( $str, $substr ) {
    $result = strpos( $str, $substr );
    if ( $result === 0 ) {
      return true;
    } else {
      return false; 
    }
}

add_action( 'template_redirect', function() {
	$rules = array(
		// звідки переправляємо -> куди
        array( 'old'=>'/ru/post-1/', 'new'=>'/ru/slider/' ),
        array( 'old'=>'/post-1/',    'new'=>'/slider/' ),
        array( 'old'=>'/page-1/',    'new'=>'https://site.com/' ),
	);

	foreach( $rules as $rule ) :
		if ( urldecode( $_SERVER['REQUEST_URI'] ) == $rule['old'] ) :
			if ( mpIsStart( $rule['new'], 'http://' ) === TRUE || mpIsStart( $rule['new'], 'https://' ) === TRUE ) {
				wp_redirect( $rule['new'], 301 );
				exit();
			} else {
				wp_redirect( site_url( $rule['new'] ), 301 );
				exit();
			}
		endif;
	endforeach;
} );

Ще один приклад, у якому є мультимовний сайт із 3-ма мовами. Потрібно на сторінці архіву категорії "Без категорії" здійснити редирект на головну сторінку сайту, причому для усіх мовних версій.

/**
 * Для укр. версії сайту:
 * 
 * https://site.com/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D1%96%D1%97/
 * https://site.com/category/без-категорії/
 * 
 * Для рос.:
 * 
 * https://site.com/ru/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8/
 * https://site.com/ru/category/без-категории/
 * 
 * Для англ.:
 * 
 * https://site.com/en/category/no-category/
 *
 */
function mp_redirect_no_category_page() {
	if ( isset( $_SERVER['HTTPS'] ) &&
	   ( $_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1 ) ||
	   isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
	   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
	   	$protocol = 'https://';
	} else {
		$protocol = 'http://';
	}

   $currenturl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   $currenturl_relative = wp_make_link_relative( $currenturl );

   // print_r( $currenturl_relative );

   switch( $currenturl_relative ) {
   
	    case '/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D1%96%D1%97/':
		   $urlto = home_url();
		   break;
	   
		case '/ru/category/%D0%B1%D0%B5%D0%B7-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8/':
			$urlto = home_url();
			break;
 
        case '/en/category/no-category/':
			$urlto = home_url();
			break;

		default:
		   return;
   }
   
   if ( $currenturl != $urlto )
	   exit( wp_redirect( $urlto, 301 ) );

}
add_action( 'template_redirect', 'mp_redirect_no_category_page' );
Для кодування/декодування кириличних URL-адрес використовуйте стандартні PHP-функції urldecode() та urlencode().

Ще один приклад редиректу, коли URL-адреса містить параметри:

/**
 * Redirect 
 * 
 * from
 * 
 * https://www.site.com.ua/uk/ru/reservation/?room-type=12345
 * https://www.site.com.ua/ru/ru/reservation/?room-type=12345
 * https://www.site.com.ua/en/ru/reservation/?room-type=12345
 * 
 * to
 * 
 * https://www.site.com.ua/reservation/?room-type=12345
 * https://www.site.com.ua/ru/reservation/?room-type=12345
 * https://www.site.com.ua/en/reservation/?room-type=12345
 * 
 */
add_action( 'template_redirect', function() {
	if ( home_url( $_SERVER['REQUEST_URI'] ) === 'https://www.site.com.ua/uk/ru/reservation/?room-type=12345' ) { 
		wp_redirect( "https://www.site.com.ua/reservation/?room-type=12345", 301 );
		exit();
	} elseif ( home_url( $_SERVER['REQUEST_URI'] ) === 'https://www.site.com.ua/ru/ru/reservation/?room-type=12345' ) {
		wp_redirect( "https://www.site.com.ua/ru/reservation/?room-type=12345", 301 );
		exit();
	} elseif ( home_url( $_SERVER['REQUEST_URI'] ) === 'https://www.site.com.ua/en/ru/reservation/?room-type=12345' ) {
		wp_redirect( "https://www.site.com.ua/en/reservation/?room-type=12345", 301 );
		exit();
	}
} );
до змісту ↑

Як налаштувати редирект 301 за допомогою плагінів

Мінус цього способу — потрібне встановлення додаткового модуля, що може збільшити кількість запитів до бази даних і сповільнити роботу сайту. Серед плюсів: просте налаштування у візуальному режимі, відстеження та статистика переходів та ведення журналу помилок 404 (неіснуюча URL-адреса).

Плагін Redirection та його налаштування

Це одне з найпопулярніших ВордПрес-рішень з великими можливостями та гнучкими налаштуваннями. Після встановлення та активації відкрийте адмін-розділ Інструменти > Redirection, введіть у відповідні поля стару та нову URL-адреси. Наприкінці натисніть кнопку нижче.

В опції Source URL не потрібно вказувати повну URL-адресу сторінки, з якої необхідно здійснювати редирект. Лише частину адреси після імені домену. Наприклад:

/page-1/
/en/page-1/
/category/cars/toyota/

Статистика всіх переходів та список помилок можна переглянути у вкладках Log та 404s.

Плагін також може зробити перенаправлення на HTTPS, www або інший домен (вкладка Site). Але для цього рекомендую використовувати файл .htaccess. У разі, якщо виникне помилка, можна швидше повернути веб-ресурс до робочого стану.

до змісту ↑

Як зробити редирект 301 через .htaccess

Цей файл відповідає за певні дії веб-сервера Apache, який використовують більшість хостингів. Директиви в .htaccess дозволяють гнучко змінювати поведінку сервера у тому чи іншому випадку. Також у ньому прописуються правила редиректів.

Файл може розміщуватися у будь-якій папці файлової системи вашого сайту. Його правила будуть застосовуватися тільки до каталогу, в якому він знаходиться. Ми ж працюватимемо з .htaccess у кореневій папці ресурсу.
Всі правила обов'язково додавайте після рядка #END WordPress.
до змісту ↑

Редирект на іншу сторінку в межах одного сайту (домену)

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

Замість old-page та new-page підставте свої значення старої та нової сторінок.

Редирект зі сторінки на інший домен

Redirect 301 /page-1/ https://www.new-site.com/page-2/

Якщо домен має www або https, їх вказувати обов'язково.

Масове перенаправлення всього сайту на інший домен

Redirect 301 / https://new-stie.com/

Всі URL-посилання залишаться колишніми, зміниться лише їхня перша частина. Тобто сторінка https://old-site.com/page-1/ стане https://new-site.com/page-1/.

Редирект сайту в підкаталог

Redirect 301 / https://new-site.com/subdirectory/

З www на без www

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

На www

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

З http на https

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.site.com/$1 [R,L]

З index.php або index.html на головну

Іноді батьківська сторінка доступна також як https://site.com/index.php або https://site.com/index.html. Це неправильно. Потрібно, щоб ці сторінки автоматично перенаправляли на головну.

# з index.php:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com/ [R=301,L]

# з index.html
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://site.com/ [R=301,L]

Як зробити редирект 301 через .htaccess, не змінюючи його безпосередньо

WordPress має вбудовані інструменти, які дозволяють додати правила у файл .htaccess кореневого каталогу сайту. А саме — фільтр mod_rewrite_rules. Для цього виконайте наступні дії.

  1. У файл functions.php додайте код
add_filter( 'mod_rewrite_rules', function ( $rules ) { 
	return $rules . "\n" . 
	"Redirect 301 /hello-world/ https://new-site.com"; 
} );
  1. Відкрийте Налаштування -> Постійні посилання та натисніть кнопку Зберегти зміни.
Підтримка тих чи інших директив у файлі .htaccess на різних хостингах може відрізнятися. Це означає, що один код працюватиме на одному хостингу, а на іншому ні. Тому завжди під рукою тримайте свіжу резервну копію свого сайту. Якщо якась інструкція не працює, спробуйте знайти її аналог або запитати у техпідтримки хостингу.

Михайло Петров
Михайло Петров

Мене звати Михайло. Я є WordPress-розробником. Створюю сайти з "нуля", розробляю плагіни, оновлюю наявний функціонал та підтримую готові проєкти.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *