Перейти к публикации

maksror

новички
  • Публикации

    2
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем maksror

  1. Данный топик открывал не я, значит как минимум у двух пользователей есть такая проблема) Бежать от "горе" администратора из-за этого я не собираюсь, уж извините. Между стабильность и дебагом софта длиною в два часа, я выберу второе) Повторюсь топик создавал не я, я лишь поделился своим способом решения, который на мой взгляд показался правильным. Если мои убитые пару часов помогут другим пользователям я буду рад, если они решат просто сменить сервак/хостера мне всё равно)

    On 6/30/2020 at 12:44 PM, kamensk said:

    Откуда такое утверждение?

     

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

    Предлагаю не разводить философские диалоги на тему того что правильно, а что нет. Расценивайте мой комментарий как решение частного(и редкого) случая. На звание истины в последней инстанции я не претендую)

  2. Я столкнулся с подобной проблемой. Решение от "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
×
×
  • Создать...