В связи с повальным переходом поисковиков и других крупных сайтов на 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. Иначе, современные браузеры начинают ругаться на содержимое страницы.