XF 1.5 Одновременное использование http и https (ssl, sni, cloudflare)

vic093

Проверенные
Сообщения
102
Реакции
21
Баллы
11,020
Нужно как-то совместить вариант c ssl и без такового, что бы часть пользователей могли использовать SSL, а остальные (у кого нет поддержки SNI) использовали обычную http.

Идея логики есть, но вот только проблема с реализацией. Напишу соображения ниже, кто силен в php - помогите реализовать.

Идея 1. Включать SSL только тем, кто использует поддерживаемый браузер/ос
В файле index.php :
PHP:
если (браузер поддерживает SNI)  {
$_SERVER['HTTPS'] = 'on';
}

Идея 2. Пользователи должны включать поддержку SSL в своем аккаунте.
В аккаунте пользователя делаем чекбокс-произвольное поле, которое он сможет редактировать в своем профиле.
Далее в шаблоне создаем условие:
PHP:
если(произвольное поле пользователя = включено){
$_SERVER['HTTPS'] = 'on';
}

Ну и идея 3.
PHP:
если(пользователь обращается к ресурсу по ссылке содержащей https){
$_SERVER['HTTPS'] = 'on';
}

PS
Вся проблема в cloudflare, который дает возможность использовать полноценный ssl только на платном тарифе. Но к сожалению предложенный способ оплаты нам не подходит. Потому еще один вопрос тем, кто использует CF - можно ли оплачивать счета виртуальной картой от qiwi?
 
Последнее редактирование:
Пока изящных решений в голову не пришло, но есть хитровыдуманный костыль на основе логики js и onload - если браузер не сможет загрузить картинку в 1 пиксель по https - скорее всего нет поддержки SNI, а значит не будем втыкать строку $_SERVER['HTTPS'] = 'on';

Если же браузер смог загрузить без ошибок пиксель по https - отдаем document.write($_SERVER['HTTPS'] = 'on';);
В файле /index.php
Код:
<?php
$startTime = microtime(true);
$fileDir = dirname(__FILE__);

/*    Начало костыля      */

$runssl= $_SERVER['HTTPS'] = 'on';
?>
<script type="text/javascript">
     if (window.location.protocol != "https:") {
        var img=document.createElement('img');
        img.src='https://ваш-сайт.рф/маленькая_картинка.jpg';
        img.onload = function() {
           var runssl=<?php echo $runssl; ?>;
           document.write(runssl);
         }
        img.style.display='none';
        document.body.appendChild(img);
     }
</script>
<?php

/*      Конец костыля       */

require($fileDir . '/library/XenForo/Autoloader.php');
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

$fc = new XenForo_FrontController(new XenForo_Dependencies_Public());
$fc->run();
Все еще надеюсь, что кто-то подскажет более изящное решение!
 
Последнее редактирование:
Например все современные браузеры
Современные - да. Но большой процент аудитории использует старое ПО.
А SNI работает только на конфигурациях новее указанных ниже.
Более ранние версии ОС или браузера не загрузят сайт.
Полный список поддерживаемых клиентов для Universal SSL выглядит следующим образом:
Desktop Browsers

  • Internet Explorer 7 and later
  • Firefox 2
  • Opera 8 with TLS 1.1 enabled
  • Google Chrome:
    • Windows XP: Chrome 6 и последующие
    • Vista и далее — полная поддержка
    • OS X начиная с 10.5.7: Chrome 5.0.342.0 и последующие
  • Safari 2.1 и последующие (начиная с OS X 10.5.6 или Windows Vista).

При этом любая версия Internet Explorer на Windows XP не поддерживает SNI.

Mobile Browsers

  • Mobile Safari for iOS 4.0+
  • Android 3.0 (Honeycomb)+
  • Windows Phone 7+
 
Как вариант, можно детектить useragent и сбрасывать флаг, если детект старой оси. Это будет быстрее, чем подгрузка js, реализуемо либо на уровне web-сервера, например nginx; либо средствами php в config.php
 
Как вариант, можно детектить useragent и сбрасывать флаг, если детект старой оси. Это будет быстрее, чем подгрузка js, реализуемо либо на уровне web-сервера, например nginx; либо средствами php в config.php
Можно чуть более наглядно?
 
Можно чуть более наглядно?
Вначале в nginx задать флаг, пусть test_sni =1; затем через проверять useragent, если совпадение, флаг сбрасывать в 0.
Теперь с $test_sni можно орудовать в конфиге или передавать с заголовками в php
Код:
fastcgi_param TEST_SNI $test_sni
Теперь в config.php будет работать конструкция вида
PHP:
if ($_SERVER['TEST_SNI'])
$_SERVER['HTTPS']='on';
Таким образом у нас в map список UA, в которых не работает sni, а все остальное будет заворачиваться в https
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу