Категории

301 редиректы - костыль на PHP, когда .htaccess не срабатывает

04.02.2026 | Статья из категории: php

Иногда веб-разработчики сталкиваются с ситуацией, когда правила 301 редиректа в .htaccess просто не работают. Особенно это актуально для CMS вроде Joomla, WordPress или других фреймворков, где есть сложная система маршрутизации.

Проблема

Допустим, у вас есть старые страницы:

И вы хотите сделать 301 редирект на главную страницу. Казалось бы, простое решение — добавить в .htaccess:

Redirect 301 /deti.html /
Redirect 301 /service.html /
Redirect 301 /lechenie.html /

Но... ничего не происходит! Страницы продолжают открываться как обычно.

Почему .htaccess не ловит?

Причин может быть несколько:

  1. Порядок правил — если у вас есть правила RewriteRule, которые обрабатывают запросы раньше ваших Redirect, то последние просто не срабатывают.
  2. Конфликт модулейRedirect работает через mod_alias, а RewriteRule через mod_rewrite. Они могут конфликтовать.
  3. CMS перехватывает запросы — Joomla, WordPress и другие системы сначала обрабатывают запрос через свой роутер, и .htaccess уже не имеет значения.
  4. Кеширование — браузеры агрессивно кешируют 301 редиректы, и изменения могут не отображаться.

Решение: костыль на PHP

Если .htaccess не работает, можно сделать редирект на уровне PHP. Это гарантированно сработает, так как код выполняется до всей логики приложения.

Простой вариант для точных страниц

<?php
// Редирект старых страниц на главную
$current_url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

$redirect_pages = [
    '/deti',
    '/deti/',
    '/deti.html',
    '/service',
    '/service/',
    '/service.html',
    '/lechenie',
    '/lechenie/',
    '/lechenie.html'
];

if (in_array($current_url, $redirect_pages)) {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: /');
    exit;
}
?>

Где вставить этот код?

Для Joomla: в файле /templates/ВАШ_ШАБЛОН/index.php — сразу после открывающего <?php в самом начале файла.

Для других систем: в основном файле шаблона или в файле, который подключается первым (например, header.php).

Как это работает?

  1. parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) — получает только путь без параметров (например, /lechenie)
  2. in_array() — проверяет точное совпадение с массивом страниц
  3. header('HTTP/1.1 301 Moved Permanently') — отправляет правильный статус 301
  4. header('Location: /') — редиректит на главную
  5. exit — прекращает выполнение скрипта

Преимущества этого подхода

Важные моменты

Заключение

Когда .htaccess подводит, а задача срочная — не бойтесь использовать костыли на PHP. Главное — делать это аккуратно и с правильными статусами для поисковиков.

Этот метод спас меня не раз, особенно при миграциях сайтов и чистке старых страниц. Надеюсь, поможет и вам!

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Посетителей сегодня: 0
о блоге

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA