Специально публикую материал в публичной части форума и пишу более подробно, чтобы он смог оказаться полезным большему числу пользователей, интересующихся данным вопросом.
Критика и дополнения приветствуются.
Дополнено 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'));
Основных файлов, где данный код нужно поправить - три. Это
- /index.php (пользовательская часть)
- /adm/includes/init.php (админ-панель)
- /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'));