Прячем Wordpress за Cloudflare
- Cloudflare умеет работать с SSL в так называемом «mixing»-режиме, при котором Cloudflare принимает от клиентов запросы по HTTPS и отправляет их настоящему сайту по HTTP.
- Это позволяет владельцам сайтов внедрять модную сейчас поддержку HTTPS с минимальными усилиями — без перенастройки веб-сервера и получения/продления сертификата.
- Однако Wordpress требует явно указывать URL сайта в своих настройках и перенаправляет клиентов на указанное имя, если видит, что имя сайта в запросе отличается от настроенного (например, при попытке открыть сайт по IP-адресу).
- Проблема возникает из-за того, что при включённом SSL mixing mode Wordpress видит не тот протокол, по которому клиент подключается к Cloudflare (т.е. HTTPS), а тот, по которому Cloudflare присылает запрос клиента веб-серверу (т.е. HTTP).
- Результатом становится бесконечное перенаправление:
- если siteurl в настройках WP содержит «https://», то WP http => CF https => WP http => ...
- если siteurl начинается с «http://», то WP http => CF http => CF https => WP http => ...
Ниже рассматриваются возможные способы решения этой проблемы.
Официальный плагин Cloudflare для Wordpress:
- Сообщает Wordpress'у реальный IP-адрес клиента.
- Кроме того, уведомляет Cloudflare о спамерах, для этого в настройках файрволла на веб-сервере должны быть разрешены исходящие обращения к api.cloudflare.com
- Дистрибутив: https://wordpress.org/plugins/cloudflare/ — скачиваем, разворачиваем, активируем, настраиваем:
- my Cloudflare API Key = ... (выдаётся в личном кабинете на Cloudflare.com).
- my Cloudflare API Email = your-email@example.org
- Development mode = Off.
- HTTPS Protocoll Rewriting = On.
Cloudflare Flexible SSL:
- Небольшой плагин от независимого автора.
- Выполняет единственное действие: сообщает ядру Wordpress'a при работе в SSL mixing mode, что обращение к сайту происходит по HTTPS.
- Дистрибутив: https://wordpress.org/plugins/cloudflare-flexible-ssl/.
Вариант из разряда «дёшево и сердито», который мы предпочитаем вместо плагинов:
- Добавляем в конец файла wp-config.php:
// HTTPS frontend with HTTP backend:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
$_SERVER['HTTPS'] = 'on';
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_X_FORWARDED_FOR"];