---
name: security-header-broke-own-iframe
description: "X-Frame-Options: DENY на все ответы API убил собственный iframe отчёта — 200 в логе, белый блок у пользователя; смотреть не на код ответа, а на экран"
metadata: 
  node_type: memory
  type: project
  originSessionId: d0c6c5aa-4d05-42e2-a1f9-034482b88603
  modified: 2026-08-01T22:44:28.499Z
---

**2026-08-02, сайт «Земля без риска».** Экспертный отчёт на `/reports/[id]` встраивается через `<iframe src="/api/reports/{id}/ai-html">`. Общий middleware вешал `X-Frame-Options: DENY` на ВСЕ ответы бэкенда — браузер отказывался рисовать фрейм, пользователь видел белое поле на 900 px вместо отчёта.

**Почему не ловилось:** эндпоинт отдаёт **200 OK**, в логе бэкенда зелено, тесты по HTTP-коду проходят. Ошибка живёт только в консоли браузера («Refused to display … X-Frame-Options to deny») и на экране. Владелец описал это как «вёрстка поехала в мобильной версии» — а горизонтального выноса не было ни на 390, ни на 1280 (`scrollW == clientW`): поехало не расположение, пропало содержимое.

**Лечение:** исключение узкое и явное — ровно один путь получает `SAMEORIGIN` + `frame-ancestors 'self'`, глобальный `DENY` остаётся. Не «снимем DENY, чтобы заработало».

**Правило:** любой глобальный security-заголовок проверять на страницах, которые встраивают собственный контент (iframe, object, PDF-вьюер). И проверять СКРИНШОТОМ, а не кодом ответа.

См. [[deployed_is_not_running]], [[zemlya_expert_report_rename_and_verify]].
