Браузер запрещает рендеринг Discourse во фрейме, несмотря на правильную конфигурацию (`X-Frame-Options: SAMEORIGIN`)

Всем привет,

У нас есть экземпляр Discourse, встроенный в iframe внутри нашего приложения, и в таком виде он работает нормально. Однако, когда неаутентифицированный пользователь пытается получить доступ к странице, к которой у него нет прав (либо страница не существует, либо она ограничена для определённой группы), в ответе теперь загадочным образом появляется заголовок X-Frame-Options: SAMEORIGIN, и браузеры блокируют отображение фрейма.

Я проверил разные версии, начиная с 3.3.1 stable и заканчивая почти текущей bleeding edge (последний тест проводился в середине прошлой недели).

Экземпляр работает на другом поддомене, чем родительское приложение, и настроен для встраивания с помощью параметра allow_embedding_site_in_an_iframe: true. При отладке чистого экземпляра я заметил, что в таком случае метод conditionally_allow_site_embedding в ApplicationController не вызывается, из-за чего заголовок остаётся в ответе (ссылка на GH). Причиной этого, как я выяснил, является выбрасывание исключения на каком-то этапе, что прерывает выполнение потока.

Воспроизведение:

  1. Запустите чистый экземпляр Discourse (или любой другой — это произошло в локальной, тестовой и продакшн-средах) и настройте его с параметром allow_embedding_site_in_an_iframe: true.
  2. Встройте его в iframe на веб-сайте, обслуживаемом через HTTPS, используя несуществующий путь, чтобы спровоцировать ошибку 404.

Ожидаемое поведение: Браузер разрешает Discourse отобразиться.
Фактическое поведение: Браузер блокирует отображение Discourse из-за наличия заголовка X-Frame-Options: SAMEORIGIN в ответе.

Примечание: Сервис работает через Cloudflare только с DNS. Мы пробовали удалить заголовок в режиме прокси, но не можем включить этот режим, так как Cloudflare фильтрует куки, необходимые для нашей реализации кастомного SSO. Поэтому на данный момент это решение для нас недоступно.