Прячем Wordpress за Cloudflare

29 ноября 2018

Прячем 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"];
    


← Назад в Блог