Как избежать проблем с перенаправлениями при миграции WordPress

Диагностика проблем с перенаправлениями после миграции

При миграции сайта WordPress на новый домен или хостинг часто возникают проблемы с перенаправлениями. Это проявляется в циклических редиректах, ошибках 404 или неправильной загрузке страниц. Для диагностики используйте следующие инструменты и методы:

  • Проверка файла .htaccess на наличие старых правил перенаправления;
  • Использование браузерного инструмента разработчика (Network) для отслеживания цепочек редиректов;
  • Команда curl для анализа заголовков HTTP, например: curl -I https://example.com;
  • Плагины для WordPress, такие как Redirection, для просмотра и управления текущими редиректами;
  • Проверка настроек URL в админке WordPress (Настройки → Общие) — адрес сайта и адрес WordPress должны быть актуальными.

Пошаговое решение проблем с перенаправлениями

1. Обновление URL в базе данных

После смены домена необходимо заменить старые URL на новые во всех записях базы данных. Это можно сделать с помощью WP-CLI:

wp search-replace 'https://old-domain.com' 'https://new-domain.com' --skip-columns=guid

Важно: исключаем замену в столбце guid, чтобы не нарушить уникальные идентификаторы.

2. Проверка и очистка файла .htaccess

Удалите или закомментируйте все правила перенаправления, которые ссылаются на старый домен. Оставьте только стандартные правила WordPress для ЧПУ:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

3. Настройка перенаправлений через плагин Redirection

Если нужно сохранить старые URL, настройте 301 редиректы на новые адреса через плагин Redirection:

  • Установите и активируйте Redirection;
  • В разделе «Redirects» добавьте правило перенаправления с старого URL на новый;
  • Проверьте, что редиректы работают без циклов.

Проверка результата после внедрения

  • Запустите curl -I https://new-domain.com/old-page и убедитесь, что получаете 301 редирект на новый URL без циклов.
  • В браузере очистите кэш и проверьте загрузку страниц по старым и новым URL.
  • Используйте онлайн-сервисы проверки редиректов, например https://httpstatus.io/.

Частые ошибки и как их исправить

  • Циклические редиректы — обычно вызваны конфликтующими правилами в .htaccess и плагинах. Решение: очистите правила и используйте только один метод перенаправлений.
  • Неправильные URL в базе данных — старые домены остались в записях. Решение: повторите wp search-replace с правильными параметрами.
  • Кэширование — старый кэш может сохранять неправильные редиректы. Очистите кэш сайта и сервера.
  • Проблемы с SSL — если SSL настроен неправильно, редиректы могут переходить в цикл. Проверьте сертификаты и конфигурацию HTTPS.

Практические советы по безопасности и производительности

  • После миграции отключите плагины, которые могли создавать перенаправления без необходимости.
  • Используйте HTTP/2 и современные протоколы SSL для ускорения загрузки страниц с перенаправлениями.
  • Минимизируйте количество редиректов: каждый редирект увеличивает время загрузки.
  • При больших сайтах с множеством URL для перенаправления рассмотрите использование правил на уровне сервера (nginx) вместо плагинов.

Сравнение способов настройки перенаправлений

МетодПлюсыМинусыКогда использовать
Правила в .htaccessБыстрые перенаправления, работают на уровне сервераСложно управлять при большом количестве правилНебольшие сайты, простые перенаправления
Плагин RedirectionУдобный интерфейс, ведение логов, гибкие настройкиМожет замедлять сайт при большом количестве правилСредние и крупные сайты, необходимость часто менять правила
WP-CLI search-replaceПолное обновление URL в базе данныхНе подходит для динамических правил перенаправленияМиграция сайта, смена домена

Пример кода для принудительного обновления URL в functions.php

Если по каким-то причинам невозможно использовать WP-CLI, можно использовать следующий скрипт для замены URL в базе данных:

function update_site_urls() {
    global $wpdb;
    $old_url = 'https://old-domain.com';
    $new_url = 'https://new-domain.com';

    $tables = [
        $wpdb->posts,
        $wpdb->postmeta,
        $wpdb->options,
        $wpdb->usermeta,
        $wpdb->users
    ];

    foreach ($tables as $table) {
        $wpdb->query($wpdb->prepare(
            "UPDATE $table SET option_value = REPLACE(option_value, %s, %s) WHERE option_value LIKE %s",
            $old_url, $new_url, '%'.$wpdb->esc_like($old_url).'%'
        ));
    }
}
add_action('init', 'update_site_urls');

После выполнения удалите этот код, чтобы избежать повторных обновлений.

⭐⭐⭐⭐⭐