Общие

Как исправить ошибку "Установлен запрет на отображение страницы во фрейме" в Яндекс.Метрике на Битрикс

Как исправить ошибку "Установлен запрет на отображение страницы во фрейме" в Яндекс.Метрике на Битрикс

Решаем проблему с картой кликов и вебвизором Яндекс.Метрики при включенной защите от фреймов в Битрикс на сервере с 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