Перевести сайт на HTTPS на шаред хостинге (apache)
На днях столкнулся с проблемой, нужно перевести сайт на SSL.
В принципе все легко, пошаговых инструкций куча, про простые вещи говорить не буду.
Скажу с чем столкнулся сам.
Сначала хотел сделать все красиво, чтобы сайт был доступен и по http и по https.
Для этого в .htaccess записал:
Убрал настройки, выставил просто:
Полез в конфиг, где отыскал формирование урл:
Захожу в консоль (спасибо Николаю!) забиваю print_r ($_SERVER); и вижу, что $_SERVER['HTTPS'] не задно, а $_SERVER['SERVER_PORT']= 80.
Ну е… Отсюда и бесконечный цикл и битые ссылки…
Зато задано $_SERVER['HTTP_FRONT_END_HTTPS'] === 'on', с этим и будем работать.
добавляю в конфиг функцию проверки https
Топик тут, потому что рейтинг у меня ниже 10))
В принципе все легко, пошаговых инструкций куча, про простые вещи говорить не буду.
Скажу с чем столкнулся сам.
Сначала хотел сделать все красиво, чтобы сайт был доступен и по http и по https.
Для этого в .htaccess записал:
RewriteCond %{HTTPS} =on
RewriteRule ^ - [env=proto:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^ - [env=proto:http]
RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
У меня на тестовом сервере это отработало на ура, на хостинге сразу вылетело в бесконечный редирект.Убрал настройки, выставил просто:
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Сайт показался, но все ссылки только на http modx. Я точно настроил https в настройках system, но MODX упорно не хотел отдавать https.Полез в конфиг, где отыскал формирование урл:
$isSecureRequest = ((isset ($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') || $_SERVER['SERVER_PORT'] == $https_port);
$url_scheme= $isSecureRequest ? 'https://' : 'http://';
define('MODX_URL_SCHEME', $url_scheme);
Вот тут меня осенило, а что же в переменных $_SERVER['HTTPS'] и $_SERVER['SERVER_PORT']?Захожу в консоль (спасибо Николаю!) забиваю print_r ($_SERVER); и вижу, что $_SERVER['HTTPS'] не задно, а $_SERVER['SERVER_PORT']= 80.
Ну е… Отсюда и бесконечный цикл и битые ссылки…
Зато задано $_SERVER['HTTP_FRONT_END_HTTPS'] === 'on', с этим и будем работать.
добавляю в конфиг функцию проверки https
if(!function_exists('is_https')){
function is_https($https_port=443)
{
if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on')
{
return TRUE;
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
{
$_SERVER['HTTPS']=on;
return TRUE;
}
elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] === 'on')
{
$_SERVER['HTTPS']=on;
return TRUE;
}
elseif (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] === $https_port)
{
return TRUE;
}
return FALSE;
}
}
и меняю проверку $isSecureRequest на$isSecureRequest = is_https($https_port);
В htaccess пишу:RewriteEngine On
RewriteCond %{SERVER_PORT} !^443 [OR]
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC] [OR]
RewriteCond %{HTTP:Front-End-Https} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Так все ок. Более простой вариант — свой VPS))Топик тут, потому что рейтинг у меня ниже 10))
Комментарии: 1
Костыль для Nginx https://modx.pro/help/8062/#comment-95807
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.