.htaccess - настройка редиректов и последствия (в т.ч. для Opencart)

Просмотров: 2121Комментарии: 4

Практически каждый день сталкиваюсь с проблемами пользователей после вмешательств в htaccess. Не говоря уже о создаваемых постоянно темах на форуме с просьбами о помощи.

Порой из-за какой то ерунды типа изменения адреса одного товара происходит несколько страниц писанины бреда и конструированию огромных полотен правил.

Что НЕЛЬЗЯ делать через htaccess

В интернете десятки тысяч инструкций просто копируемых друг у друга десятилетиями. Очень многие из них вредны, т.к. были актуальны для сайтов на голом HTML без формирователя ЧПУ. Современные CMS самостоятельно строят формат адресации на сайте и нельзя вмешиваться в это через htaccess.

Наиболее распространенные вредные правила:

  • Добавление/Удаление слэша на конце
  • Редирект с index.php
  • Попытки убрать технические недочеты вроде route=common/home
  • Удаление/Добавление/Замена .html на конце
  • Редирект с 404 на страницу "Страница не найдена" (даже звучит бредово)

  • Что не нужно делать через htaccess

    Множество единичных редиректов

    Файл .htaccess используется при любом обращении к сайту, при открытии каждой страницы идет от одного до нескольких десятков, порой и сотен обращений (в зависимости от настройки связки nginx/apache), при этом каждый раз происходит обработка всех правил в файле. Поэтому не рационально засорение htaccess единичными редиректами. Это, помимо полного бардака и мешанины, замедляет ответ сайта.


    Распространенные последcтвия вмешательства в htaccess

    • неработоспособность всего сайта или определенных страниц
    • выпадение из индекса страниц из-за ошибки или неверных редиректов
    • появление страниц с _route_= и прочими лишними включениями в адресе
    • циклические редиректы (страница сайта выполнила переадресацию слишком много раз)
    • появление страниц с повторяющимися сегментами адреса (/qwerty/qwerty/qwerty/qwerty/qwerty)
    • цепочки редиректов (несколько вместо одного), что сильно замедляет или вовсе убивает склейку
    • при большом количестве правил - замедление ответа сервера

    Часто ошибки всплывают со временем, когда обнаруживается выпадение страниц из поиска и идет разбор причин.


    Когда нужно делать редиректы через htaccess

    В глобальных правилах: за счет работы на более низком уровне, apache позволяет снизить расход ресурсов, т.к. их не много и требуется применение ко всем страницам.

    Редирект с www на без оного, или наоборот

    Пример правила

    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # тут внимательно надо с https/http дабы не было цепочек редиректов

    обратное

    RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
    RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L] # помним про https/http

    Редирект на https

    Пример правила

    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

    Глобальные редиректы по маске

    Если например произошел переезд с другой CMS. В случае когда на сайте были определенные правила адресации по типу: все товары - site.com/product/XXX, все категории - site.com/category/YYY и т.д. Тогда можно обойтись несколькими правилами. По прошествии нескольких месяцев лучше перенести эти правила на уровень выше и перенаправлять средствами CMS, т.к. к старым адресам уже практически не будет обращений.

    Пример как убрать product/ из адреса:

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

    ⚠ При наличии внешней ссылочной массы, желательно не менять адресацию на сайте, а перестроить формирователь ЧПУ и обойтись без редиректов.


    ⚠ Все глобальные правила дoлжны идти перед правилами CMS.

    ⚠ Правило WWW должно идти раньше чем https для исключения лишнего звена редиректа


    Когда делать редиректы силами php (не CMS)

    В случаях когда требуется настроить редиректы с адресов вида /product_info.php?products_id=123, /product/?id=345, и т.д., а именно когда есть возможность обратиться напрямую к php-файлу без инициализации CMS.

    Разберем на примере site.com/product_info.php?products_id=XXX.

    Создаем файл product_info.php в корне, где будет список редиректов и мини скрипт

    <?php
    $id = (int)$_GET['products_id'];
    $host = 'https://site.com/';
    $redirects = array(  //список редиректов 
        '123' => 'phones/xiaomi/note-9s',
        '456' => 'laptots/hp-15',
        '789' => 'pc/dell-qwerty',
        );
    if (isset($redirects[$id])) {
        header($_SERVER["SERVER_PROTOCOL"]." 301 Moved Permanently"); 
        header("Location: " . $host . $redirects[$id]); 
        exit();
    }    
        
    header($_SERVER["SERVER_PROTOCOL"]." 410 Gone"); // если такого не было в списке, сообщаем что страница удалена и код 410
    echo '<h1>Страница удалена</h1> <a href="/">Перейти на главную ></a> ';
    ?>

    не забываем в htaccess добавить в исключения путь /product_info.php* дабы избежать цепочек редиректов

    RewriteCond %{REQUEST_URI} !^/product_info\.php(.*)

    Требование к менеджеру редиректов в CMS

    Основное в случае менеджера редиректов в CMS - это правильный механизм работы.

    ⚠ Самое главное - Условия инициализации

    Поиск/Проверка/Перебор не должен подключаться при каждом обращении к сайту, а только если страница не существует.

    Это:

    • Не приводит к замедлению работы сайта.
    • Безопасно (редирект не сработает если страница существует и была добавлена по ошибке)

    Разделение правил на части

    Грамотное разделение правил на части позволяет сэкономить ресурсы. Нет необходимости перебирать правила там где они заведомо не сработают.

    Возможность использования дополнительных данных

    Менеджер редиректов может использовать функционал CMS для получения ряда данных, которые затем могут использоваться в механизме автоматизации.


    Когда делать редиректы силами CMS в менеджере редиректов

    Нет опыта и квалификации в работе с htaccess

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

    Множество правил

    Использование инструмента CMS не приводит к засорению htaccess и ряду сопутствующих проблем.

    Да и банально намного удобнее добавлять/удалять/следить/редактировать.

    Правила не являются глобальными

    Если взять средний сайт с 500 уникальными посетителями в день и средней глубиной 3. Это минимум 1500 обращений в день, на самом деле в разы больше. В неделю же минимум 10 тыс. Плюс боты. И если повезет одно обращение будет к искомой странице с редиректом, ради него будет 10 тыс раз читаться правило из htaccess.

    Дополнительный функционал

    Интеграция в CMS дает определенные преимущества. В первую очередь - возможность отслеживания статуса страниц, а так же ряд иных, в том числе работа с БД и автоматизация.


    Несколько советов

    • Не перенаправляйте с кучи старых страниц на главную, пытаясь избежать 404.
    • Не перенаправляйте с не существующих либо удаленных на страницу "Ошибка 404". Это трактуется как "Страница перемещена по новому адресу, после индексации новой, если она доступна, то будет склейка". Спустя определенное время, при следующих обходах, выясняется что страница на которую идет редирект - не существует, вывод - редирект ошибочен.
    • Не делайте "временные" редиректы с кодом 301. Например с отключенного товара, который потом может быть включен. (302 либо 303/307)
    • Не делайте редиректы с кодом 301 на авторизацию, региональные версии, мобильные версии и т.д. - то есть те которые работают в зависимости от ситуации.

    Комментариев: 4 RSS

    Оставьте комментарий!
    • Без регистрации
    • Вход/Регистрация

    Комментарий будет опубликован после проверки

    Вы можете войти под своим логином или зарегистрироваться на сайте.

    grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

    • 1Анатолий07-06-2020 14:56Учитываю...

      Доброго дня,подскажите как должен выглядеть htaccess для опенкарт 2,3 на данный момент, чтобы не использовать старый вариант

      • 2master07-06-2020 18:27Учитываю...

        Анатолий, ничего не нужно изобретать, стандартный + разобраться с www/https

    • 3Влад08-06-2020 18:18Учитываю...

      Добрый день!

      А можно сделать редирект с одной страницы сайта на другую так, чтобы новая страница открывалась в новой вкладке?

      Именно редиректом, а не добавлением атрибута target со значением _blank в коде html?

      • 4master09-06-2020 23:43Учитываю...

        Влад, нельзя, только через заглушку, используя js