Переход на HTTPS

В связи с повальным переходом поисковиков и других крупных сайтов на HTTPS, пришлось и мне вглянуть в его сторону. Я в общем-то никак не страдал от его отсутсвия на основном сайте, хотя использовал самодельный сертификат на админке блога и почте.

Однако, полный переход поисковиков на https сломал мне сбор статистики — при переходе с https на http, поле referrer не заполняется. Покупать у какого-либо CA сертификат для сайта я был не готов, но тут на глаза подвернулась статья на хабре(ссылка на хабре), что один из китайских CA раздаёт сертификаты бесплатно, да ещё и сроком на 3 года, и на несколько поддоменов. Грех было не воспользоваться возможностью получить годный сертификат, да ещё и бесплатно. При этом, как оказалось с момента публикации статьи на хабре, китайцы сделали вполне годный интерфейс на английском(за сертификатами идти сюда). Правда, сайт у китайцев тормозит безбожно, что-либо сделать на нём я смог только когда в Китае была глубокая ночь. В остальное время, сайт постоянно не прогружался и подвисал.

Но вот сертификат успешно получен(китайцы кстати дают архив, с сертификатом подготовленным под разные веб-серверы, и сразу в архиве дают промежуточные). Я не долго думая, заменил свой самодельный, поправил конфиг веб-сервера отдавать блог через https — и ничего хорошего не получилось. Теперь уже была проблема с настройкой wordpress'а. Сайт у меня работает по такой схеме:

1
Интернет --> ExtIP:443(Nginx) --> IntIP:80(Apache)

В ней nginx принимает и обрабатывает защищённое содение по 443 порту, а затем, по обычному https отдаёт его в apache, где он уже и обрабатывается php. При такой схеме возникла проблема — ежели зайти на сайт, то wordpress ничего не знает по https, и поэтому, отдаёт все ссылки на ресурсы страницы в виде обычного http. Из-за этого, браузер начинает ругаться — типа у вас есть на странице есть ссылки на ресурсы по http, поэтому, показывать их не буду. Ежели в настройках блога включить https, то тут возникает другая проблема — wordpress отслеживает по какому протоколу к нему пришёл запрос http или https, и ежели он приходит не по https (а у мменя было именно так, nginx делает обращение к apache по обычному http), то wordpress генерирует редирект на тот же ресурс, но по протоколу https, что ведёт к бесконечной рекурсии. Решений тут несколько:
1. Убрать nginx, вытащить наружу апач и повесить его на работу с 443 портом.
2. В текущей схеме на апаче поднять поддержку https, чтобы работа между nginx и apache велась через https.

Но так как, «настоящие герои всегда идут в обход» © — я сделал по другому. В исходниках wordpress'а я нашёл код, который отвечает за проверку как работает сайт, через https или нет, и сделал в нём небольшую правку — теперь он всегда считает что работает через https. Как оказалось, за это отвечает функци is_ssl () из файла wp-includes/load.php. Было так:

1
2
3
4
5
6
7
8
9
10
11
12
13
function is_ssl() {
 if ( isset($_SERVER['HTTPS']) ) {
    if ( 'on' == strtolower($_SERVER['HTTPS']) )
        return true;
    if ( '1' == $_SERVER['HTTPS'] )
        return true;
 }
elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) )
 {
    return true;
 }
return false;
}

А сейчас стало так:

1
2
3
4
5
6
7
8
9
10
11
12
13
function is_ssl() {
  if ( isset($_SERVER['HTTPS']) ) {
      if ( 'on' == strtolower($_SERVER['HTTPS']) )
         return true;
      if ( '1' == $_SERVER['HTTPS'] )
         return true;
}
elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) )
 {
     return true;
 }
return true;
}

Главное теперь при обновлении не забыть, где и что я правил, иначе сайт у меня опять сломается. А нужно это для того, чтобы при загрузке на сайт файлов и вставке их в заметки, к ним прописывался правильный URL — через https, а не через http. Иначе, современные браузеры начинают ругаться на содержимое страницы.

Categories: UNIX
admin:
Related Post