Иногда веб-разработчики сталкиваются с ситуацией, когда правила 301 редиректа в .htaccess просто не работают. Особенно это актуально для CMS вроде Joomla, WordPress или других фреймворков, где есть сложная система маршрутизации.
Проблема
Допустим, у вас есть старые страницы:
/deti.html/service.html/lechenie.html
И вы хотите сделать 301 редирект на главную страницу. Казалось бы, простое решение — добавить в .htaccess:
Redirect 301 /deti.html /
Redirect 301 /service.html /
Redirect 301 /lechenie.html /
Но... ничего не происходит! Страницы продолжают открываться как обычно.
Почему .htaccess не ловит?
Причин может быть несколько:
- Порядок правил — если у вас есть правила
RewriteRule, которые обрабатывают запросы раньше вашихRedirect, то последние просто не срабатывают. - Конфликт модулей —
Redirectработает черезmod_alias, аRewriteRuleчерезmod_rewrite. Они могут конфликтовать. - CMS перехватывает запросы — Joomla, WordPress и другие системы сначала обрабатывают запрос через свой роутер, и .htaccess уже не имеет значения.
- Кеширование — браузеры агрессивно кешируют 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).
Как это работает?
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)— получает только путь без параметров (например,/lechenie)in_array()— проверяет точное совпадение с массивом страницheader('HTTP/1.1 301 Moved Permanently')— отправляет правильный статус 301header('Location: /')— редиректит на главнуюexit— прекращает выполнение скрипта
Преимущества этого подхода
- Работает всегда — PHP выполняется до всей логики приложения
- Точный контроль — можно легко добавить или убрать страницы
- Не зависит от сервера — работает на любом хостинге с PHP
- SEO-friendly — отправляет правильный статус 301
Важные моменты
- Код должен выполняться до любого вывода на экран (до первого
echoили HTML) - После установки обязательно проверяйте в режиме инкогнито (кеш браузера!)
- Если нужно редиректить много страниц, лучше использовать базу данных или конфиг
Заключение
Когда .htaccess подводит, а задача срочная — не бойтесь использовать костыли на PHP. Главное — делать это аккуратно и с правильными статусами для поисковиков.
Этот метод спас меня не раз, особенно при миграциях сайтов и чистке старых страниц. Надеюсь, поможет и вам!
Комментарии
Пока нет комментариев. Будьте первым!