maksror
-
Публикации
2 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем maksror
-
-
Я столкнулся с подобной проблемой. Решение от "russhe" имеет место быть, но не известно какие последствия оно будет иметь в будущем, тем более если потребуется перенести проект на HTTPS протокол. В ходе своего дебага я капнул немного глубже и нашёл причину проблемы, по крайней мере для моего случая. Думаю, что проблема иногда возникает у пользователей, поэтому опубликую своё решение.
Как заметил "russhe" в посте выше проблема возникает на этом этапе(engine\init.php)
if( isSSL() AND stripos( $config['http_home_url'], 'http://' ) !== false ) { $config['http_home_url'] = str_replace( "http://", "https://", $config['http_home_url'] ); }
Но причина проблемы не в замене http на https, а в самой проверке. Из этого блока кода проблемной(у меня) являлась проверка isSSL(). Данная функция описана в файле engine/modules/functions.php (строки 3093-3103):
function isSSL() { if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') || (isset($_SERVER['CF_VISITOR']) && $_SERVER['CF_VISITOR'] == '{"scheme":"https"}') || (isset($_SERVER['HTTP_CF_VISITOR']) && $_SERVER['HTTP_CF_VISITOR'] == '{"scheme":"https"}') ) return true; else return false; }
Как проверить, у вас что проблема именно в функции isSSL():
1. Создаём скрипт со следующим содержимым:
<?php define("DATALIFEENGINE",true); include_once("engine/modules/functions.php"); var_dump(isSSL());
2. Обращаемся к данному скрипту через браузер. Если вы обращались по HTTP протоколу, но получили ответ bool(true), то у вас проблема о которой я говорю.
Проблема заключается в переменных веб-серверов($_SERVER["VARIABLE"]). Для примера рассмотрю проверку одной такой переменной. В условиях указано $_SERVER['HTTPS'] !== 'off'. Проверки этой переменной на совпадение с Off нет(внимание на регистр off != Off). Как указывать off или Off выбирает системный администратор сервера(оба варианта имею место быть и являются правильными) и если вы используете, например shared хостинг менять значение на уровне веб-серверов не будут. Проверить такая проблема у вас или нет можно простым скриптом:
<?php var_dump($_SERVER['HTTPS']);
После чего к скрипту нужно обратиться через браузер(запуск через php-cli не даст нужной информации) по HTTP протоколу. Есть вероятность, что вы получите ответ:
string(3) "Off"
Соответственно на этом этапе мы и получаем неправильную проверку протоколу, ведь off != Off. Такую же проверку вы можете сделать для других переменных, если есть желание чётко понять значение какой переменной ломает проверку. Я решил проблему с помощью функции strtolower изменив функцию isSSL() следующим образом:
function isSSL() { if( (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && strtolower($_SERVER['HTTP_X_FORWARDED_SSL']) == 'on') || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) || (isset($_SERVER['REQUEST_SCHEME']) && strtolower($_SERVER['REQUEST_SCHEME']) == 'https') || (isset($_SERVER['CF_VISITOR']) && strtolower($_SERVER['CF_VISITOR']) == '{"scheme":"https"}') || (isset($_SERVER['HTTP_CF_VISITOR']) && strtolower($_SERVER['HTTP_CF_VISITOR']) == '{"scheme":"https"}') ) return true; else return false; }
Дальше нужно отчистить кэш движка (engine/cache/system/).
Надеюсь данное решение поможет кому-то из пользователей DLE.
- 1
{full-link} формирует ссылки с https
в DataLife Engine (Общие вопросы)
Опубликовано:
Данный топик открывал не я, значит как минимум у двух пользователей есть такая проблема) Бежать от "горе" администратора из-за этого я не собираюсь, уж извините. Между стабильность и дебагом софта длиною в два часа, я выберу второе) Повторюсь топик создавал не я, я лишь поделился своим способом решения, который на мой взгляд показался правильным. Если мои убитые пару часов помогут другим пользователям я буду рад, если они решат просто сменить сервак/хостера мне всё равно)
Вот тут пожалуй немного уточню, я не нашёл какого-либо стандарта по заданию данных переменных окружения веб-серверов. Да, есть дефолт, который редко меняют. Но с учётом того, что многие веб-серваки это открытый софт(не говоря уже о самописах) который поддерживает плагинистость, то вариаций может быть много.
Предлагаю не разводить философские диалоги на тему того что правильно, а что нет. Расценивайте мой комментарий как решение частного(и редкого) случая. На звание истины в последней инстанции я не претендую)