Решаем проблему с картой кликов и вебвизором Яндекс.Метрики при включенной защите от фреймов в Битрикс на сервере с nginx
Оглавление
- [Описание проблемы](#problem)
- [Почему возникает ошибка](#why-error)
- [Быстрая диагностика](#diagnostics)
- [Решение для Битрикс Virtual Appliance](#solution-va)
- [Решение для обычного хостинга](#solution-hosting)
- [Проверка результата](#check-result)
- [Часто задаваемые вопросы](#faq)
- [Заключение](#conclusion)
<a name="problem"></a>
Описание проблемы
Если вы используете **1С-Битрикс** с включенной проактивной защитой и пытаетесь просмотреть **карту кликов** или **вебвизор** в Яндекс.Метрике, вы можете столкнуться с ошибкой:
Невозможно воспроизвести посещение на данной странице. Возможные причины:
Не установлен код счётчика
Установлен запрет на отображение страницы во фрейме
Попробовать открыть на http://webvisor.com
Эта ошибка появляется даже если вы **отключили защиту от фреймов** в настройках Битрикс. В этой статье мы подробно разберем, как решить эту проблему, сохранив при этом защиту сайта от clickjacking-атак.
Ключевые симптомы проблемы:
- ❌ Не работает карта кликов Яндекс.Метрики
- ❌ Не воспроизводится вебвизор
- ❌ Не отображается карта скроллинга
- ❌ Не работает аналитика форм
- ✅ При этом сбор статистики работает нормально
<a name="why-error"></a>
Почему возникает ошибка
Что такое защита от фреймов?
**Защита от фреймов** (X-Frame-Options) — это механизм безопасности, который предотвращает **clickjacking-атаки**. При такой атаке злоумышленник встраивает ваш сайт в невидимый iframe на своей странице и обманом заставляет пользователей кликать по элементам вашего сайта.
Конфликт настроек
В случае с **Битрикс Virtual Appliance** или серверами с **nginx** проблема возникает из-за того, что заголовок `X-Frame-Options: SAMEORIGIN` может устанавливаться на **трех уровнях**:
- **Битрикс** (модуль Проактивная защита)
- **Nginx** (веб-сервер)
- **Apache** (если используется)
Даже если вы отключите защиту в Битрикс, nginx продолжит блокировать фреймы, что и вызывает ошибку в Яндекс.Метрике.
Почему Яндекс.Метрика использует фреймы?
Инструменты визуальной аналитики Яндекс.Метрики (карта кликов, вебвизор, карта скроллинга) отображают ваш сайт внутри iframe на странице метрики. Это позволяет:
- Накладывать тепловую карту поверх сайта
- Воспроизводить действия пользователей
- Показывать аналитику в реальном времени
<a name="diagnostics"></a>
Быстрая диагностика
Прежде чем приступить к решению, давайте убедимся, что проблема именно в заголовках безопасности.
Шаг 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](https://securityheaders.com) для проверки заголовков вашего сайта.
<a name="solution-va"></a>
Решение для Битрикс 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';
<a name="solution-hosting"></a>
Решение для обычного хостинга (без доступа к nginx)
Если у вас обычный хостинг без доступа к настройкам nginx, используйте только PHP-решение.
Вариант 1. Через .htaccess (Apache)
Создайте или дополните файл `/public_html/.htaccess`:
<IfModule mod_headers.c>
# Удаляем существующий заголовок
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;"
</IfModule>
Вариант 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");
}
?>
<a name="check-result"></a>
Проверка результата
Тест 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. Проверка вебвизора
- Перейдите в **Вебвизор**
- Выберите любую запись
- Воспроизведение должно работать
<a name="faq"></a>
Часто задаваемые вопросы
❓ Безопасно ли отключать защиту от фреймов для Яндекс.Метрики?
**Да, это безопасно.** Мы отключаем защиту только для конкретных доменов Яндекс.Метрики. Для всех остальных сайтов защита продолжает работать.
❓ Почему не работает после отключения в админке Битрикс?
Битрикс контролирует только свои заголовки. Если 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
<a name="conclusion"></a>
Заключение
Проблема с отображением карты кликов и вебвизора Яндекс.Метрики на сайтах Битрикс — распространенная ситуация, особенно при использовании **Битрикс Virtual Appliance** или серверов с **nginx**.
Ключевые моменты решения:
✅ **Двухуровневый подход** — настройка и на уровне PHP, и на уровне веб-сервера
✅ **Сохранение безопасности** — защита от clickjacking остается активной
✅ **Избирательное отключение** — разрешаем фреймы только для Яндекс.Метрики
✅ **Совместимость** — решение работает с любой версией Битрикс
Полезные ссылки:
- [Официальная документация Яндекс.Метрики по фреймам](https://yandex.ru/support/metrica/code/counter-webvisor.html)
- [Документация Битрикс по проактивной защите](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=35&LESSON_ID=2043)
- [MDN Web Docs: X-Frame-Options](https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/X-Frame-Options)
- [CSP frame-ancestors](https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)
Нужна помощь?
Если у вас остались вопросы или нужна помощь с настройкой, вы можете:
- Оставить комментарий под статьей
- Написать в техподдержку вашего хостинга
- Обратиться к специалисту по Битрикс
**Метки:** #битрикс #яндексметрика #вебвизор #картакликов #nginx #безопасность #clickjacking #xframeoptions #csp #битриксva #centos7
**Последнее обновление:** Январь 2025