Редирект 301 в MODX Revo и Evo

Когда я впервые переносила сайт с WordPress на MODX, то столкнулась с проблемой настройки редиректа. Обычно для перенаправления на новые страницы в файл .htaccess используют стандартное правило:

Redirect 301 /old-page.html https://new-domain.ru/new-page.html

Но в MODx этот способ не работает. При редиректе в ссылках появлялются лишние символы и выглядят они примерно так:

https://new-domain.ru/new-page.html?q=new-page.html

Пользователи при этом перенаправляются на страницу с 404 ошибкой.

Оказалось, что для настройки 301 редиректа нужно использовать другие решения.

Редирект 301 для MODX Revolution

Компонент Redirector
Первый и самый простой вариант — воспользоваться готовым дополнением. Компонент Redirector можно установить на свой сайт из админ.панели в разделе «Управление пакетами». После установки в меню админки в разделе «Компоненты» появляется новый пункт — «Управление редиректами». Заходим и видим пока еще пустой список редиректов.

Нажимаем кнопку «Создать новый редирект» во всплывающем окне пишем правило:

Шаблон — url старой страницы без первого слеша, например old-page.html
Цель — полный адрес новой страницы https://new-domain.ru/new-page.html

Редирект с помощью директивы RewriteRule модуля mod_rewrite
Директива RewriteRule дает нам много возможностей для перенаправления страниц на новые адреса, а главное, ее можно использовать при разработке сайтов на MODx Revolution.

Вот как можно сделать перенаправление с одной страницы на другую

RewriteRule ^page1.html$ /page2.html [R=301,L]

Напомню, что я переносила свой сайт с WordPress, и url статей включали название рубрик. На новом сайте я не собиралась использовать вложеные ссылки, кроме того, мне необходимо было добавить к ссылкам префикс .html

Чтобы при переходе по ссылке типа https://domain.ru/category/postname/ пользователи и поисковые машины были перенаправлены на страницу типа https://domain.ru/postname.html в файле .htaccess после строк

RewriteEngine On
RewriteBase /

добавляем

RewriteRule ^category/(.*)/$ /$1.html [R=301,NC,L]

Редирект 301 для MODX Evolution

Для тех, кто предпочитает версию Evolution тоже есть простое решение настройки редиректа — плагин RedirectMap. Расскажу, как установить его на свой сайт.

Элементы>> Управление элементами>> Плагины

Создаем новый плагин с именем RedirectMap (хотя на самом деле, не имеет значения, как вы его назовете, хоть Gorshok — плагин все равно будет работать).

На вкладке «Общие» вводим код плагина:

    global $modx;

$mapChunk = $modx->getChunk($chunk);

$mapLines = explode("rn",$mapChunk);

$mapArr = array();

foreach($mapLines as $line) {
        list($link,$redirectId) = explode('||',$line);
        $mapArr[$link] = $redirectId;
}

$q = $_REQUEST['q'];

if(isset($mapArr[$q])) {
        $url = $modx->makeUrl($mapArr[$q]);
        $modx->sendRedirect($url,0,'REDIRECT_HEADER','HTTP/1.1 301 Moved Permanently');
        exit();
}

Переходим на вкладку «Конфигурация», вводим:

&chunk=Чанк с картой редиректов;text;redirect

На вкладке «Системные события» выбираем OnPageNotFound

Далее нам нужно создать новый чанк с названием redirect, где будет храниться список всех наших редиректов. Пример содержания чанка:

old_page.html||12

Где old_page.html — url старой страницы без первого слеша, 12 — id документа, на который будет идти перенаправление. Каждый редирект пишем с новой строки. Сохраняем чанк и проверяем, работает ли переадресация.

Еще по теме:

  • Александр

    здравствуйте. Подскажите пожалуйста если старый урл имеет вид
    /aviaperevozki/aviaperevozki-iz-evropy/
    но в админке в материале алиас просто
    aviaperevozki-iz-evropy

    а новый например под id 12
    То нужно указывать так aviaperevozki-iz-evropy||12
    или полностью?
    Заранее спасибо за ответ

  • https://vk.com/id243950991 Сергей Апричников

    Так между делом: Думаю, многие из вас сталкивались с основными дублями, когда: вашсайт.ru доступен по следующим адресам: вашсайт.ru/index.php, вашсайт.ru/index.html, вашсайт.ru/index.htm. Чтобы этого избежать, добавьте следующий код, сразу после:«RewriteEngine On». Выглядеть будет примерно так:

    RewriteEngine On
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.(php|html|htm) HTTP/
    RewriteRule ^(.*)index.(php|html|htm)$ $1 [R=301,L]
    RewriteBase /

    Ну а для проверки набрать: вашсайт.ru/index.html и т д. И уберите из роботекста лишний мусор =)

  • Ольга

    «Думаю, многие из вас сталкивались с основными дублями» — на MODX ни разу не сталкивалась

  • https://twitter.com/Sigiller Sigiller

    Спасибо за статью! Очень долго пришлось искать, чтобы найти правильный ответ)

  • https://vk.com/id7171031 Иван Гомзяков

    Работаю на Modx Evo.
    Сделал всё как написано. Работает 1 редирект, который делал первым. Остальные не хотят работать(