Почему перестала работать переадресация, учитывающая родительский раздел?

Здравствуйте. Раньше автоматически срабатывал редирект /moscow/ → /russia/moscow/ (страница «Москва» находится в разделе «Россия»), но с некоторого момента он перестал работать и сейчас /moscow/ перенаправляет на /. Настройки при этом не менялись — в чем может быть причина? Установлены плагины: https://ru.wordpress.org/plugins/redirection/ и https://wordpress.org/plugins/404-to-301/. В вебмастере Яндекса для таких страниц в заголовках видно: X-Redirect-By: WordPress.
  • 6 июля 2026 г. 17:00
Ответы на вопрос 1
Короткий ответ — причина в редиректе, который инициируется WordPress (или плагином, который использует wp_redirect). Заголовок X-Redirect-By: WordPress сам по себе не гарантирует, что это «чисто» ядро: и core, и плагины обычно используют wp_redirect и дают такой же заголовок. Поэтому нужно отладить, кто именно делает редирект и почему сейчас он уводит на / вместо /russia/moscow/.

Что проверить и сделать (пошагово, от простого к более глубокому):

1) Посмотреть ответ сервера «в лоб»
   - Выполните в консоли:
     curl -I -L -v https://вашдомен.ru/moscow/
   - Посмотрите код ответа (301/302) и цепочку редиректов. Это даст представление, на каком шаге и с каким заголовком уходит запрос.

2) Отключить плагины, которые наиболее вероятны
   - Временно деактивируйте плагин 404-to-301 и проверьте поведение снова.
   - Если не помогло — деактивируйте Redirection.
   Часто 404-to-301 по умолчанию перенаправляет все 404 на главную (что и похоже на ваш случай).

3) Переустановите/сбросьте ЧПУ
   - В админке: Настройки → Постоянные ссылки → Сохранить изменения (даже без изменения) — это сбросит rewrite-правила.
   - После этого проверьте /moscow/ ещё раз.

4) Проверить наличие конфликтующих объектов с тем же slug
   - В базе (wp_posts) выполните запрос: SELECT ID, post_type, post_parent, post_status FROM wp_posts WHERE post_name = 'moscow';
   - Убедитесь, что нет другого поста/страницы/attachment с тем же slug, который может влиять на поиск правильного URL. Если есть attachment или черновик — это бывает причиной некорректных редиректов.

5) Логи и выяснение, кто именно делает редирект
   - Добавьте временно в functions.php или mu-plugin такой код, чтобы поймать, кто вызывает redirect_canonical/редирект:
     add_filter('redirect_canonical', function($redirect_url, $requested_url){
         error_log("redirect_canonical: requested: $requested_url -> redirect: $redirect_url | backtrace: " . print_r(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5), true));
         return $redirect_url;
     }, 10, 2);
   - Или логировать все wp_redirect вызовы:
     add_filter('wp_redirect', function($location, $status){
         error_log("wp_redirect to $location status $status\n" . print_r(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5), true));
         return $location;
     }, 10, 2);
   - После этого вызовите /moscow/ и посмотрите error_log — по backtrace увидите файл/плагин, инициировавший редирект.

6) Проверить правила плагина Redirection
   - В админке Redirection — есть ли правило, которое ловит /moscow/ или все 404/неизвестные и отправляет на / ?

7) Тема и functions.php
   - Временно переключитесь на дефолтную тему (например Twenty Twenty-Three) — чтобы исключить кастомный код в теме, который делает редирект.

8) Кэш и CDN
   - Очистите кэш сайта, плагинов и CDN (Cloudflare и т.п.). Иногда старые правила остались в кеше и ведут на главную.

Почему раньше редиректил на /russia/moscow/, а теперь на /:
- Возможные причины: обновление/настройка плагина (404-to-301 стал перенаправлять 404 на /), появление другого объекта с slug moscow, изменение правил пермалинков или сбой в lookup WP (он не нашёл страницу и плагин/настройка отправила на /).
- WP core автоматически пытается «угадывать» правильный URL (redirect_canonical/redirect_guess_404_permalink). Если угадывание не сработало, плагин 404-to-301 мог поймать 404 и отослать на /.

Если хотите, помогу точнее — пришлите:
- результат curl -I -L -v https://вашдомен.ru/moscow/
- список активных плагинов
- вывод запроса SELECT ... WHERE post_name = 'moscow' (или просто скрин/список страниц с таким slug).
Похожие вопросы