Вопрос или проблема
У меня проблема с haproxy и смешанным контентом. Когда я пытаюсь подключиться через haproxy по SSL, браузер (в данном случае Firefox или Chrome), в конфигурации по умолчанию, блокирует смешанный контент – в данном случае HTTP-соединения. Это не происходит, когда я пытаюсь подключиться без haproxy.
Что может быть причиной этого?
Для справки:
Я установил haproxy версии 1.5.11
haproxy -v HA-Proxy version 1.5.11 2015/01/31 Copyright 2000-2015 Willy Tarreau
с этой конфигурацией:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
stats timeout 30s
debug
daemon
# включить сокет для статистики
stats socket /var/lib/haproxy/admin.sock mode 660 level admin
# Путь к материалам SSL по умолчанию
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Шифры по умолчанию для использования на SSL-активных сокетах.
# Для получения дополнительной информации смотрите ciphers(1SSL).
ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4
SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend webphp53_http
bind *:80
bind *:443 ssl crt /etc/ssl/private/cert.pem
mode http
default_backend webphp53_servers
backend webphp53_servers
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1\r\nHost:localhost
server php53_node1 192.168.127.67:80 check
server php53_node2 192.168.127.68:80 check
Смешанный контент полностью блокируется, если домены различаются. Убедитесь, что при переключении на использование балансировщика нагрузки смешанный контент на странице использует одно и то же имя сервера.
Я обнаружил, что проблема возникает только при использовании CMS, такой как Drupal и WordPress. Я нашел решение – заставить обе системы использовать HTTPS. В случае с Drupal нужно отредактировать файл sites/default/settings.php и раскомментировать строку:
$base_url=”https://domain_name_blablabla“;
В случае с WordPress необходимо установить плагин WordPress HTTPS (SSL) https://wordpress.org/plugins/wordpress-https/
Ответ или решение
Смешанное содержимое (mixed content) является распространенной проблемой при использовании HTTPS и HAProxy, особенно когда речь идет о системах управления контентом (CMS) таких как Drupal и WordPress. Давайте более подробно разберем вашу проблему и предложим полное решение.
Причины проблемы
Когда вы используете HAProxy для управления подключениями SSL, браузеры, такие как Firefox и Chrome, блокируют HTTP-содержимое, если основное соединение было установлено через HTTPS. Это происходит по следующим причинам:
- Безопасность: Браузеры стремятся защитить пользователей от потенциальных угроз, связанных с загрузкой небезопасного содержимого (HTTP) на страницах, которые были загружены по безопасному протоколу (HTTPS).
- Политики Mixed Content: Если у вас на сайте есть ссылки на ресурсы, которые загружаются по HTTP, браузер заблокирует эти запросы, если основной контент загружен через HTTPS.
Решение
Шаг 1: Проверьте настройки HAProxy
Убедитесь, что HAProxy правильно настроен для обработки SSL. Ваша конфигурация на первый взгляд выглядит корректно, но есть несколько моментов, которые стоит проверить:
- Убедитесь, что все запросы перенаправляются на HTTPS. Вы можете добавить правило перенаправления в секцию
frontend
:
frontend webphp53_http
bind *:80
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/ssl/private/cert.pem
mode http
Это правило перенаправит все HTTP-запросы на HTTPS.
Шаг 2: Настройки CMS
Для устранения проблемы с смешанным содержимым в CMS, таких как Drupal и WordPress, вам необходимо принудительно установить использование HTTPS.
Drupal:
- Откройте файл
sites/default/settings.php
. - Найдите строку, которая объявляет
$base_url
. Включите HTTPS:
$base_url = "https://your_domain_name";
WordPress:
- Установите и активируйте плагин WordPress HTTPS (SSL).
- Настройте плагин, чтобы убедиться, что все ссылки и ресурсы загружаются через HTTPS.
Шаг 3: Проверка ссылок на ресурсы
Проверьте все ссылки на статические ресурсы (изображения, CSS, JavaScript) в вашей CMS. Убедитесь, что они указывают на HTTPS. Это также может требовать редактирования шаблонов или настроек плагинов.
Заключение
После выполнения всех вышеперечисленных шагов ваш сайт должен корректно обрабатывать соединения через HTTPS без блокировки смешанного содержимого. Убедитесь, что вы протестировали сайт после вносения изменений, чтобы убедиться, что все ресурсы загружаются безопасно. Если проблемы остаются, проверьте консоль разработчика в браузере на наличие дополнительных ошибок и скорректируйте настройки по мере необходимости.