Когда начал использовать бесплатный SSL от Cloudflare я конечно читал что на бесплатном тарифе SSL поддерживается «Most modern browsers», но наивно подумал что «Most modern browsers» это почти «All browsers». Увы, это далеко не так. Лично у меня во всех браузерах и на всех устройствах все сразу заработало как надо, я на радостях еще и HTTP с концами отключил (поставил серверный редирект с HTTP на HTTPS). А вот пользователи сразу начали жаловаться что не могут зайти на сайт, выдает ошибку вроде «На сайте используется неподдерживаемый протокол». Первую жалобу посчитал еденичным случаем, и отправил пользователя обновлять браузер. Но следом появилась аналогичная жалоба еще от одного пользователя. А потом еще, и еще, и еще. А ведь далеко не все могут догадаться как пожаловаться админу сайта который вообще не открывается. Реальное количество отказов в доступе думаю было намного больше чем количество поступивших жалоб.
В общем пользователей пользующихся браузерами не попадающими под категорию «Most modern browsers» оказалось не так мало, чтобы отказываться от них ради бесплатного SSL от Cloudflare. Но и от SSL или Cloudflare отказываться тоже не хотелось.
Решение проблемы — клиентский редирект.
HTTP оставляем основным протоколом, указываем http:// в ссылках для «поделиться» и тому подобных, в общем делаем все чтобы повысить вероятность попадания нового пользователя на сайт именно по HTTP.
В head страниц добавляем примерно такой код:
Если подключение не по HTTPS, в head добавляется загрузка скрипта https.js по HTTPS-протоколу. Если HTTPS не поддерживается браузером скрипт не подгрузится и пользователь останется на HTTP. Если браузер поддерживает HTTPS, то будет подгружен скрипт который перебросит пользователя на эту же страницу по HTTPS.
Пример скрипта https.js
В общем пользователей пользующихся браузерами не попадающими под категорию «Most modern browsers» оказалось не так мало, чтобы отказываться от них ради бесплатного SSL от Cloudflare. Но и от SSL или Cloudflare отказываться тоже не хотелось.
Решение проблемы — клиентский редирект.
HTTP оставляем основным протоколом, указываем http:// в ссылках для «поделиться» и тому подобных, в общем делаем все чтобы повысить вероятность попадания нового пользователя на сайт именно по HTTP.
В head страниц добавляем примерно такой код:
<head>
<?php if(!$https) print '<script async src="https://'.$_SERVER['HTTP_HOST'].'/https.js"></script>'; ?>
</head>
Если подключение не по HTTPS, в head добавляется загрузка скрипта https.js по HTTPS-протоколу. Если HTTPS не поддерживается браузером скрипт не подгрузится и пользователь останется на HTTP. Если браузер поддерживает HTTPS, то будет подгружен скрипт который перебросит пользователя на эту же страницу по HTTPS.
Пример скрипта https.js
if(window.location.protocol != 'https:') {
window.location = 'https://'+window.location.host+window.location.pathname+window.location.search+window.location.hash;
}