Перевести сайт на HTTPS на шаред хостинге (apache)

На днях столкнулся с проблемой, нужно перевести сайт на SSL.

В принципе все легко, пошаговых инструкций куча, про простые вещи говорить не буду.

Скажу с чем столкнулся сам.

Сначала хотел сделать все красиво, чтобы сайт был доступен и по 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))
Николай
22 января 2017, 08:58
modx.pro
2
2 026
+1

Комментарии: 1

Metallurg.IT
31 марта 2018, 14:13
0
Костыль для Nginx https://modx.pro/help/8062/#comment-95807
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1