Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Переход на HTTPS старых версий Diafan CMS (5.4 и ниже)

  • 03 сентября 2017 г. , редакция: 26 апреля 2019 г.
  • Специально публикую материал в публичной части форума и пишу более подробно, чтобы он смог оказаться полезным большему числу пользователей, интересующихся данным вопросом.
    Критика и дополнения приветствуются.


    Дополнено 20.10.2017

    С каждым годом требования перехода сайтов на протокол HTTPS перетекают из области рекомендации в область обязательных к исполнению. Сайты на HTTP уже помечаются как небезопасные и далее этот процесс будет только ужесточаться. Для сайтов, разработанных на актуальной версии CMS никаких проблем не возникнет - нужно будет купить сертификат, либо установить бесплатный и всё. Внутри CMS версии 6.0 и выше процедура определения протокола уже отлажена.

    А вот со старыми версиями CMS всё несколько сложнее. Там миграция на HTTPS посредством только лишь покупки SSL-сертификата может вызвать целый ряд проблем. А учитывая, что достаточно большое количество проектов, выполненных на 5.4 и ниже, были тем или иным способом доработаны, обновить их в автоматическом режиме не представляется возможным. Да и в ручном это сделать далеко не всегда просто.

    Поэтому самый оптимальный вариант решения вопроса - ручное обновление файлов, в которых есть код, отвечающий за формирование URL. Техническая поддержка даёт по этому вопросу следующую информацию:
    Цитата
    В актуальной версии DIAFAN.CMS протокол соединения подставляется автоматически. Поэтому как таковых правок не требуется. Однако для полной уверенности следует пройтись автоматическим поиском по всем файлам сайта. Например, в файлах административной части cms присутствуют ссылки без автоматической подстановки протокола.

    В целом, данная цитата лишь в малой степени проливает свет на то, с чем придётся столкнуться, что всё-таки делать и с чего начинать. Простой поиск по фразе "http" в файлах системы выявит более 150 000 совпадений и картина от этого яснее не станет.



    ПРОЦЕДУРА ОБНОВЛЕНИЯ ФАЙЛОВ
    Основное отличие версий 5.4 и 6.0 можно отследить в файле index.php, посмотрев процедуру определения константы BASE_PATH:

    Diafan 5.4
    Код
    define('BASE_PATH', "http".(! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '')."://".getenv("HTTP_HOST")."/".(REVATIVE_PATH ? REVATIVE_PATH.'/' : ''));
    Diafan 6.0
    Код
    define('BASE_PATH', "http".(IS_HTTPS ? "s" : '')."://".getenv("HTTP_HOST")."/".(REVATIVE_PATH ? REVATIVE_PATH.'/' : ''));

    Как видно из примеров выше, основное отличие в использовании в старых версиях глобальной переменной $_SERVER['HTTPS'], а в новых версиях - константы IS_HTTPS, которая определяется выше в файле index.php:
    Код
    define('IS_HTTPS', (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' || ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || isset($_SERVER['HTTP_X_HTTPS']) && $_SERVER['HTTP_X_HTTPS'] == '1'));

    Основных файлов, где данный код нужно поправить - три. Это
    1. /index.php (пользовательская часть)
    2. /adm/includes/init.php (админ-панель)
    3. /themes/functions/show_head.php (определение $this->diafan->_site->canonical)
    Разумеется, файлов несколько больше и во избежании возможных проблем найти и поправить желательно всё.
    Строки, в которых фигурирует $_SERVER['HTTPS'], не идентичны. Например в файле init.php можно встретить:
    Код
    define('BASE_PATH', "http".(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '')."://".getenv("HTTP_HOST")."/".( REVATIVE_PATH ? REVATIVE_PATH.'/' : '' ) );
    Код
    define('BASE_PATH_HREF', "http".(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '')."://".getenv("HTTP_HOST")."/".( REVATIVE_PATH ? REVATIVE_PATH.'/' : '' ).ADMIN_FOLDER.'/'.$row["shortname"].'/' );

    Поэтому основной упор нужно делать на поиск глобальной переменной $_SERVER['HTTPS'], который даст уже куда более чёткое представление о том, что и в каких файлах править.



    В найденных файлах нужно заменить этот участок кода (для версии 5.4):
    Код
    .(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '').
    на этот:
    Код
    .(IS_HTTPS ? "s" : '').

    В более старых версия CMS код отличается от представленного выше (для 5.4). Смотрите как объявляется константа BASE_PATH в файле index.php. Из этого станет понятно - что искать. Но чаще всего там будет использована та же $_SERVER['HTTPS'].

    Чтобы новый код работал корректно, следует в файл index.php перед определением BASE_PATH добавить определение константы IS_HTTPS:
    Код
    define('IS_HTTPS', (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' || ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || isset($_SERVER['HTTP_X_HTTPS']) && $_SERVER['HTTP_X_HTTPS'] == '1'));
    • 03 сентября 2017 г.
    • Цитата
      нужно будет купить сертификат
      , не «нужно», а «можно». У нас вот их можно, например, получить без покупки.

      Код
      и всё
      , не всё, ещё чуть-чуть перенастроить хостинг.

      И в актуальной версии CMS не всё и не автоматически. Насколько я знаю, есть проблема кэша, которая может доставлять неприятности, если не настроено автоматическое перенаправление с http на https протокол. CMS может кэшировать url с http и выдавать их пришедшим по https, чем браузеры могут быть недовольны почти так же как и при посещении сайта по http, а может даже и больше, ведь основной url по https и что то вдруг тут же проскакивает по http.

      Если это не так и ситуация исправилась, успокойте меня :)

      А в общем и целом мы всё же актуальность, в том числе и CMS, с пониманием того как всё не просто с обновлением :)
      • 03 сентября 2017 г. , редакция: 05 февраля 2019 г.
      • Цитата
        ещё чуть-чуть перенастроить хостинг.
        Хостер, предоставляющий услугу хостинга и в подавляющем большинстве случаев продающий сертификат, как правило сам его устанавливает и настраивает.

        Правильное замечание про кэш. Действительно, закэшированное по HTTP содержимое не перекэшируется при обращении по HTTPS. При этом браузер выдаст предупреждение о небезопасном содержимом пользователю, которое его разумеется насторожит.

        Поэтому после окончания всех процедур следует сделать редирект с протокола HTTP на HTTPS через файл .htaccess (если у вас Apache):
        Код
        # Перенаправление на HTTPS
        RewriteCond %{HTTPS} =off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]

        # Исключение из редиректа robots.txt
        RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC]

        Файл robots.txt по требованию поисковых систем нужно из правила редиректа исключить (запись выше).

        Отмечу также, что не стоит торопиться и сразу ставить редирект после установки сертификата и правки файлов, поскольку Яндекс в таком случае исключит старое основное зеркало сайта и из-за редиректа не сможет создать новое. Подробнее об этом можно почитать у Платона Щукина.

        А протестировать как встал сертификат можно при помощи этого сервиса: SSL Server Test.
        • 03 сентября 2017 г.
        • Хороший сервис ;) протестил наш демо сайт с бесплатным сертификатом, показал A+.
        • 25 сентября 2017 г.
        • Код
          # Перенаправление на HTTPS
          RewriteCond %{SERVER_PORT} !^443$
          RewriteRule ^(.*)$ https://www.sajt.ru/$1 [R=301,L]

          # Исключение из редиректа robots.txt
          RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC]


          всё отлично работает НО

          Не подскажите редирект с https://www на https:// - (301 с www на без www с протоколом https )
          • 26 сентября 2017 г. , редакция: 26 сентября 2017 г.
          • Так добавьте дополнительную запись для редиректа с www. Она в htaccess Diafan присутствует, да и в интернете найти не проблема:
            Код
            RewriteCond %{HTTP_HOST} ^www.(.*) [NC]
            RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
    • 25 сентября 2017 г.
    • Здравствуйте, решили diafan 5.1 перевести на https и конечно же наткнулись на проблемы

      главная заработала а вот админка нет, судя по теме нужно внести изменения в init.php
      Но вот беда не вижу похожего кода в этом файле
      Содержимое у нас следующее

      1 часть кода
      Код
      define( 'BASE_PATH', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) );

      require_once(ABSOLUTE_PATH.'plugins/IDNA.php');
      $IDN = new idna_convert(array('idn_version' => '2008'));
      $domain = $IDN->decode($_SERVER["HTTP_HOST"]);
      define('BASE_URL', ($domain ? $domain : $_SERVER["HTTP_HOST"]) . ( REVATIVE_PATH ? '/' . REVATIVE_PATH : '' ) );


      2 часть

      Код
      if ($rew[0] == $row["shortname"] && ! $row["base_admin"])
      {
      $_GET["rewrite"] = preg_replace('/^' . $rew[0] . '(\/)*/', '', $_GET["rewrite"]);
      define( '_LANG', $row["id"]);
      define( '_SHORTNAME', $row["shortname"] . '/' );
      define( 'TITLE', ( defined('TIT' . $row["id"]) ? constant('TIT' . $row["id"]) : '' ) );
      define( 'BASE_PATH_HREF', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) . ADMIN_FOLDER . '/' . $row["shortname"] . '/' );
      break;
      }
      }

      Показать весь код
      }
      if (!defined('_LANG'))
      {
      foreach ($this->languages as $row)
      {
      if ($row["base_admin"])
      {
      define( '_LANG', $row["id"]);
      define( '_SHORTNAME', '' );
      define( 'TITLE', ( defined('TIT' . $row["id"]) ? constant('TIT' . $row["id"]) : '' ) );
      define( 'BASE_PATH_HREF', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) . ADMIN_FOLDER . '/' );
      break;
      }
      }
      }
      }


      Пробывали менять с HTTP на HTTPS без изменений

      Надеюсь всё что нужно зацепил из кода

      • 26 сентября 2017 г. , редакция: 26 сентября 2017 г.
      • Ищите в папке сайта текстовым поиском все совпадения $_SERVER["HTTP_HOST"], т.к. они в вашем случае участвуют в формировании ссылки. Смотрите строки, где формирование ссылки есть. Меняйте везде, а не только в init.php.

        Сначала смотрите что у вас в index.php. Отсюда понимаете что искать. Ищете в остальных файлах. Я порядка 20 правок вносил.
        • 26 сентября 2017 г.
        • На что в моём случае менять? Мне вот это не особо понятно(((

          Это
          Код
          $_SERVER["HTTP_HOST"]


          на это?
          Код
          (IS_HTTPS ? "s" : '')

          • 26 сентября 2017 г. , редакция: 26 сентября 2017 г.
          • $_SERVER["HTTP_HOST"] хранит значение HTTP_HOST
            (IS_HTTPS ? "s" : '') конструкция которая добавляете букву s если константа IS_HTTPS = true

            То есть
            Код
            "http" . (IS_HTTPS ? "s" : '') . "://".<доменное имя (переменная или где оно хранится) > . "?" . <плюс прочие атрибуты если таковые имеются>


            Если применимо к этой строке
            Код
            define( 'BASE_PATH', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) );

            то получается вот так
            Код
            define( 'BASE_PATH', "http" . (IS_HTTPS ? "s" : '') . "://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) );

            • 26 сентября 2017 г.
            • А сайт сильно перепилен, что обновится до свежей версии представляется опасным?
              Светаните ссылочку
            • 26 сентября 2017 г. , редакция: 26 сентября 2017 г.
            • Денис, IS_HTTPS объявляется и определяется в index.php. Причём, насколько я знаю, только начиная с 6-ой версии. В более старых её надо самостоятельно объявлять.
          • 26 сентября 2017 г. , редакция: 26 сентября 2017 г.
          • Цитата
            На что в моём случае менять? Мне вот это не особо понятно(((
            Если без лишних исправлений/добавлений, то менять надо это: "http://" . $_SERVER["HTTP_HOST"] на это "https://" . $_SERVER["HTTP_HOST"]
  • 20 июня 2018 г.
  • Читал, читал, да и не понял, на версии 5.0 что поправить, чтобы с админкой всё нормально было? Она грузится, но все картинки и разметка слетают. Речь о доступе к админе по https.
    • 21 июня 2018 г.
    • Обновите cms до актуальной версии. Этого будет достаточно.
      • 21 июня 2018 г.
      • Виталий, если бы это было так просто для большинства аудитории, я бы эту статью не писал.
    • 21 июня 2018 г. , редакция: 21 июня 2018 г.
    • Открывайте index.php в корне сайта и смотрите как там реализовано формирование константы:
      Смотрите как объявляется константа BASE_PATH в файле index.php. Из этого станет понятно - что искать.
      Ну и исходя из этого ищете фрагмент кода в основных файлах сайта, а при желании во всех. Лучше поискать везде.

      Но если выше написанное Вам плохо понятно, то из этого следует, что задача эта для специалиста, которого, видимо, требуется нанять.
  • 31 мая, понедельник
  • Код
    define('IS_HTTPS', (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' || ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || isset($_SERVER['HTTP_X_HTTPS']) && $_SERVER['HTTP_X_HTTPS'] == '1'));


    IS_HTTPS не всегда выдаёт https ссылку на https сайте. Пришлось прописать руками
    Код
    define('BASE_PATH', "https://".getenv("HTTP_HOST")."/".(REVATIVE_PATH ? REVATIVE_PATH.'/' : ''));

Новости

  • 1 апреля
  • После кучи тестов, исправлений и допиливаний мы наконец обновились. Масштабно, основательно, круто. Партнерам, принявшим участие в финальном тестировании, выражаем искреннюю благодарность: ребята, вы очень помогли, спасибо! Подробности на главной.

Блоги

  • 22.03.2021
  • В уже далёком 2016-ом году, 1 января в 01:17 ночи разработчики DIAFAN.CMS самоотверженно выложили в свободный доступ версию DIAFAN.CMS 6.0. С тех пор прошло 5 лет и вот мы подходим к новому рубежу - версии DIAFAN.CMS 7.0. Давайте посмотрим – что же ждёт нас в новой версии CMS.