Решаем проблему с картой кликов и вебвизором Яндекс.Метрики при включенной защите от фреймов в Битрикс на сервере с nginx
Оглавление
Описание проблемы
Если вы используете 1С-Битриксс включенной проактивной защитой и пытаетесь просмотретькарту кликовиливебвизор в Яндекс.Метрике, вы можете столкнуться с ошибкой:
Невозможно воспроизвести посещение на данной странице. Возможные причины:
Не установлен код счётчика
Установлен запрет на отображение страницы во фрейме
Попробовать открыть на http://webvisor.com
Эта ошибка появляется даже если вы отключили защиту от фреймов в настройках Битрикс. В этой статье мы подробно разберем, как решить эту проблему, сохранив при этом защиту сайта от clickjacking-атак.
Ключевые симптомы проблемы:
-
❌ Не работает карта кликов Яндекс.Метрики
-
❌ Не воспроизводится вебвизор
-
❌ Не отображается карта скроллинга
-
❌ Не работает аналитика форм
-
✅ При этом сбор статистики работает нормально
Почему возникает ошибка
Что такое защита от фреймов?
Защита от фреймов(X-Frame-Options) — это механизм безопасности, который предотвращаетclickjacking-атаки. При такой атаке злоумышленник встраивает ваш сайт в невидимый iframe на своей странице и обманом заставляет пользователей кликать по элементам вашего сайта.
Конфликт настроек
В случае с Битрикс Virtual Applianceили серверами сnginxпроблема возникает из-за того, что заголовок X-Frame-Options: SAMEORIGIN может устанавливаться натрех уровнях:
-
Битрикс (модуль Проактивная защита)
-
Nginx (веб-сервер)
-
Apache (если используется)
Даже если вы отключите защиту в Битрикс, nginx продолжит блокировать фреймы, что и вызывает ошибку в Яндекс.Метрике.
Почему Яндекс.Метрика использует фреймы?
Инструменты визуальной аналитики Яндекс.Метрики (карта кликов, вебвизор, карта скроллинга) отображают ваш сайт внутри iframe на странице метрики. Это позволяет:
-
Накладывать тепловую карту поверх сайта
-
Воспроизводить действия пользователей
-
Показывать аналитику в реальном времени
Быстрая диагностика
Прежде чем приступить к решению, давайте убедимся, что проблема именно в заголовках безопасности.
Шаг 1. Проверяем код метрики
Откройте консоль разработчика в браузере (F12) на вашем сайте и выполните:
// Проверка наличия объекта метрики
if (typeof ym !== 'undefined') {
console.log('✅ Код метрики установлен');
} else {
console.log('❌ Код метрики не найден');
}
Шаг 2. Проверяем заголовки сервера
Если у вас есть SSH-доступ к серверу, выполните:
curl -I https://ваш-сайт.ru 2>&1 | grep -i "x-frame-options"
Если видите X-Frame-Options: SAMEORIGIN или X-Frame-Options: DENY — проблема найдена.
Шаг 3. Проверяем через онлайн-сервисы
Используйте сервис SecurityHeaders.com для проверки заголовков вашего сайта.
Решение для Битрикс Virtual Appliance (CentOS 7 + nginx)
Этап 1. Настройка PHP-обработчика в Битрикс
Создайте или отредактируйте файл /home/bitrix/www/bitrix/php_interface/init.php:
<?php
/**
* Интеллектуальная защита от фреймов
* Отключаем защиту только для Яндекс.Метрики
*/
if (isset($_SERVER['HTTP_REFERER'])) {
// Список доверенных доменов Яндекс.Метрики
$metrikaHosts = [
'webvisor.com',
'metrika.yandex.ru',
'metrika.yandex.ua',
'metrika.yandex.com',
'metrika.yandex.by',
'metrika.yandex.kz',
'metrica.yandex.ru',
'metrica.yandex.com',
'mteza.yandex.ru',
$_SERVER['HTTP_HOST'], // Для режима взаимодействия
];
// Получаем домен источника запроса
$refHost = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
// Если запрос от Яндекс.Метрики
if (in_array($refHost, $metrikaHosts)) {
// Отключаем проверку фреймов в Битрикс
define('BX_SECURITY_SKIP_FRAMECHECK', true);
// Пытаемся удалить заголовки от nginx (не всегда работает)
if (!headers_sent()) {
header_remove("X-Frame-Options");
header("X-Frame-Options: ALLOWALL");
}
}
}
// Логирование для отладки (опционально)
if (defined('BX_SECURITY_SKIP_FRAMECHECK') && BX_SECURITY_SKIP_FRAMECHECK === true) {
// Можно добавить запись в лог для отладки
// file_put_contents('/tmp/metrika.log', date('Y-m-d H:i:s') . ' - Frame check skipped for: ' . $_SERVER['HTTP_REFERER'] . PHP_EOL, FILE_APPEND);
}
?>
Этап 2. Настройка nginx для условного применения заголовков
Шаг 1. Создаем карту для определения источника
Создайте файл /etc/nginx/bx/conf/metrika-fix.conf:
# Карта для определения, нужно ли применять X-Frame-Options
map $http_referer $frame_options {
# По умолчанию защищаем от фреймов
default "SAMEORIGIN";
# Разрешаем фреймы для Яндекс.Метрики
"~*webvisor\.com" "";
"~*metrika\.yandex\.(ru|ua|com|by|kz)" "";
"~*metrica\.yandex\.(ru|com)" "";
"~*mteza\.yandex\.ru" "";
# Разрешаем для своего домена (режим взаимодействия в метрике)
"~*^https?://ваш-сайт\.ru" ""; # Замените на ваш домен
}
# Применяем заголовок только если он не пустой
map $frame_options $x_frame_options {
"" "";
default $frame_options;
}
Шаг 2. Подключаем карту в основной конфиг
Отредактируйте /etc/nginx/nginx.conf:
http {
# ... другие настройки ...
# Подключаем настройки для Яндекс.Метрики
include /etc/nginx/bx/conf/metrika-fix.conf;
# ... остальные настройки ...
}
Шаг 3. Изменяем способ добавления заголовка
Найдите и отредактируйте файл /etc/nginx/bx/conf/general-add_header.conf:
# Делаем резервную копию
cp /etc/nginx/bx/conf/general-add_header.conf /etc/nginx/bx/conf/general-add_header.conf.backup
# Редактируем файл
nano /etc/nginx/bx/conf/general-add_header.conf
Замените строку:
add_header X-Frame-Options SAMEORIGIN;
На:
# Условное добавление X-Frame-Options (не блокируем Яндекс.Метрику)
add_header X-Frame-Options $x_frame_options always;
Этап 3. Применение изменений
# Проверяем корректность конфигурации nginx
nginx -t
# Если тест прошел успешно, перезагружаем nginx
systemctl reload nginx
# Очищаем кеш Битрикс
rm -rf /home/bitrix/www/bitrix/cache/*
rm -rf /home/bitrix/www/bitrix/managed_cache/*
# Очищаем кеш nginx (если используется)
rm -rf /var/cache/nginx/*
Этап 4. Включаем защиту в Битрикс
Теперь можно безопасно включить защиту от фреймов в административной панели:
-
Перейдите в Настройки → Настройки продукта → Модули → Проактивная защита
-
Включите опцию “Защита от фреймов”
-
Сохраните настройки
Или через SSH:
mysql -u root -p
USE имя_вашей_базы;
UPDATE b_option SET VALUE = 'Y' WHERE MODULE_ID = 'security' AND NAME = 'frame';
Решение для обычного хостинга (без доступа к nginx)
Если у вас обычный хостинг без доступа к настройкам nginx, используйте только PHP-решение.
Вариант 1. Через .htaccess (Apache)
Создайте или дополните файл /public_html/.htaccess:
*
# Удаляем существующий заголовок
Header always unset X-Frame-Options
# Устанавливаем Content-Security-Policy вместо X-Frame-Options
# Это более современный способ с большими возможностями
Header set Content-Security-Policy "frame-ancestors 'self' https://metrika.yandex.ru https://metrika.yandex.com https://metrica.yandex.ru https://metrica.yandex.com https://webvisor.com https://*.webvisor.com;"
Вариант 2. Через PHP (универсальный)
Добавьте в начало файла /bitrix/header.php:
<?php
// Проверяем источник запроса
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$isMetrika = false;
// Список доменов Яндекс.Метрики
$metrikaDomains = [
'webvisor.com',
'metrika.yandex',
'metrica.yandex'
];
foreach ($metrikaDomains as $domain) {
if (strpos($referer, $domain) !== false) {
$isMetrika = true;
break;
}
}
// Если это Яндекс.Метрика, разрешаем фрейм
if ($isMetrika) {
header_remove("X-Frame-Options");
header("X-Frame-Options: ALLOWALL");
} else {
// Для всех остальных - защита
header("X-Frame-Options: SAMEORIGIN");
}
?>
Проверка результата
Тест 1. Проверка заголовков для Яндекс.Метрики
# Имитируем запрос от Яндекс.Метрики
curl -I -H "Referer: https://metrika.yandex.ru/" https://ваш-сайт.ru 2>&1 | grep -i "x-frame"
# Должно вернуть пустоту или X-Frame-Options: ALLOWALL
Тест 2. Проверка заголовков для обычных запросов
# Обычный запрос
curl -I https://ваш-сайт.ru 2>&1 | grep -i "x-frame"
# Должно вернуть X-Frame-Options: SAMEORIGIN
Тест 3. Проверка в Яндекс.Метрике
-
Откройте Яндекс.Метрику
-
Перейдите в Карты → Карта кликов
-
Выберите любую страницу
-
Карта должна отображаться корректно
Тест 4. Проверка вебвизора
-
Перейдите в Вебвизор
-
Выберите любую запись
-
Воспроизведение должно работать
Часто задаваемые вопросы
❓ Безопасно ли отключать защиту от фреймов для Яндекс.Метрики?
Да, это безопасно. Мы отключаем защиту только для конкретных доменов Яндекс.Метрики. Для всех остальных сайтов защита продолжает работать.
❓ Почему не работает после отключения в админке Битрикс?
Битрикс контролирует только свои заголовки. Если nginx или Apache добавляют заголовок на уровне сервера, настройки Битрикс не помогут.
❓ Можно ли использовать Content-Security-Policy вместо X-Frame-Options?
Да, и это даже лучше! CSP — более современный и гибкий метод. Пример:
add_header Content-Security-Policy "frame-ancestors 'self' https://metrika.yandex.ru https://webvisor.com;" always;
❓ Что делать, если у меня CloudFlare?
CloudFlare может добавлять свои заголовки безопасности. Проверьте настройки:
-
Войдите в панель CloudFlare
-
Перейдите в Security → Settings
-
Найдите Security Headers
-
Настройте исключения для путей или отключите X-Frame-Options
❓ Как проверить, откуда именно добавляется заголовок?
Используйте режим разработчика в браузере:
-
Откройте DevTools (F12)
-
Перейдите на вкладку Network
-
Обновите страницу
-
Кликните на главный документ
-
Посмотрите Response Headers
Заключение
Проблема с отображением карты кликов и вебвизора Яндекс.Метрики на сайтах Битрикс — распространенная ситуация, особенно при использовании Битрикс Virtual Applianceили серверов сnginx.
Ключевые моменты решения:
✅ Двухуровневый подход — настройка и на уровне PHP, и на уровне веб-сервера
✅ Сохранение безопасности — защита от clickjacking остается активной
✅ Избирательное отключение — разрешаем фреймы только для Яндекс.Метрики
✅ Совместимость — решение работает с любой версией Битрикс
Полезные ссылки:
Нужна помощь?
Если у вас остались вопросы или нужна помощь с настройкой, вы можете:
-
Оставить комментарий под статьей
-
Написать в техподдержку вашего хостинга
-
Обратиться к специалисту по Битрикс
Метки: #битрикс #яндексметрика #вебвизор #картакликов #nginx #безопасность #clickjacking #xframeoptions #csp #битриксva #centos7
Последнее обновление: Январь 2025
Ищете надежного партнера по веб-разработке и автоматизации? Мы помогаем бизнесу расти с помощью современных технологий, автоматизации процессов и экспертного SEO. Свяжитесь с нами, чтобы обсудить вашу задачу.