В современных проектах на WordPress часто применяются CDN (Content Delivery Network) и Varnish Cache для ускорения загрузки страниц и снижения нагрузки на сервер. Однако совместное использование SSL, CDN и Varnish может привести к различным проблемам, таким как смешанный контент, некорректные редиректы и ошибки безопасности HTTPS. В этой статье подробно разберем, как правильно настроить SSL в WordPress с учетом этих технологий.
Особенности работы SSL с CDN и Varnish
CDN и Varnish работают как промежуточные прокси-серверы между пользователем и вашим хостингом. Они могут кэшировать контент и оптимизировать доставку, но при этом влияют на передачу HTTPS-запросов.
Основные сложности возникают из-за того, что SSL-сертификат обычно установлен на сервере, но запросы к серверу проходят через CDN и Varnish, где может происходить расшифровка и повторное шифрование трафика (SSL Termination). В результате WordPress может «не видеть» корректный протокол HTTPS и генерировать ссылки с http://, что вызывает ошибки смешанного контента.
Для корректной работы нужно обеспечить, чтобы WordPress понимал, что соединение с пользователем защищено HTTPS, даже если между CDN/Varnish и сервером используется HTTP.
Настройка WordPress для корректного HTTPS при использовании CDN и Varnish
1. Установка SSL-сертификата на CDN и сервер
Первый шаг — наличие действующего SSL-сертификата как на вашем сервере, так и на CDN. Многие популярные CDN, например Cloudflare, предоставляют бесплатные сертификаты и настроены на поддержку HTTPS из коробки.
Для Varnish SSL-сертификат обычно устанавливается на фронтенд-сервере (например, Nginx), так как Varnish сам не поддерживает SSL. То есть SSL расшифровывается на Nginx, а Varnish работает с обычным HTTP-трафиком.
2. Правильная передача заголовков от CDN и Varnish к WordPress
WordPress определяет протокол HTTPS по серверной переменной $_SERVER['HTTPS'] и заголовкам прокси-сервера. Чтобы WordPress понимал, что соединение защищено, необходимо правильно настроить передачу заголовка X-Forwarded-Proto:
RequestHeader set X-Forwarded-Proto "https"В конфигурации Nginx или Apache, которая работает перед Varnish, надо убедиться, что этот заголовок передается правильно.
3. Принудительное определение HTTPS в WordPress (wpssl_define_https)
Чтобы гарантировать правильное определение HTTPS внутри WordPress, добавьте следующий код в wp-config.php:
function wpssl_is_ssl() {
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
return true;
}
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === '1')) {
return true;
}
return false;
}
if (wpssl_is_ssl()) {
$_SERVER['HTTPS'] = 'on';
}Этот код проверяет заголовок X-Forwarded-Proto, который выставляют CDN и Varnish, и при необходимости устанавливает переменную $_SERVER['HTTPS'], чтобы WordPress корректно определял протокол.
Решение проблем смешанного контента при работе с CDN и SSL
Даже при правильной настройке SSL и CDN, на сайте могут появляться ошибки смешанного контента, связанные с тем, что некоторые ресурсы (изображения, скрипты, стили) загружаются по http. Для решения используйте несколько подходов.
1. Плагин для поиска и замены URL
Отлично подойдет плагин Real URL Fixer или Velvet Blues Update URLs. Они помогут быстро заменить все http:// на https:// в базе данных.
2. Использование фильтра для автоматической замены URL
Можно добавить фильтр, который будет автоматически менять http на https при выводе контента:
add_filter('the_content', 'wpssl_fix_mixed_content');
function wpssl_fix_mixed_content($content) {
$content = str_replace('http://', 'https://', $content);
return $content;
}Этот способ прост, но менее эффективен, чем замена в базе.
3. Настройка CDN на автоматическое переписывание URL
Многие CDN, например Cloudflare, предоставляют функцию автоматического переписывания URL на HTTPS. Включите её в панели управления CDN, чтобы избежать ошибок смешанного контента.
Пример настройки Varnish и Nginx с SSL для WordPress
Ниже пример минимальной конфигурации Nginx для работы с SSL и Varnish:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:6081; # Varnish слушает на 6081
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}В конфигурации Nginx важно передать заголовок X-Forwarded-Proto https, чтобы WordPress мог корректно определить протокол.
Использование плагинов для упрощения настройки SSL с CDN и Varnish
Для автоматизации и удобства можно использовать плагины:
- Clearfy Pro — содержит опции для исправления смешанного контента и корректного определения HTTPS при работе через прокси.
- WPRemark — поможет отслеживать ошибки SSL и смешанного контента в комментариях и на страницах.
Ссылки на плагины и подробные инструкции доступны на wpshop.ru.
Как проверить корректность настроек SSL с CDN и Varnish
После настройки SSL и CDN обязательно проверьте:
- Корректность загрузки сайта по HTTPS без ошибок смешанного контента. В браузере вкладка консоли (F12) должна быть чистой.
- Правильность редиректов с http на https.
- Передаются ли заголовки
X-Forwarded-ProtoиHTTPSна сервере. - Работу кэширования Varnish — не кэшируются ли редиректы и HTTPS-заголовки неправильно.
Для проверки можно использовать инструменты как SSL Labs и официальную документацию Varnish.