Додавання security-заголовків на власний сайт зламало перемикач мов і мало не заблокувало всіх AI-краулерів, яких ми професійно намагаємося привабити. Обидві проблеми ми створили собі самі, обидві були беззвучні, обидві легко повторити. Ось повний звіт.
Чому це взагалі виникає
Технічні аудити перевіряють кілька HTTP-заголовків відповіді: політику безпеки контенту, X-Content-Type-Options, Strict-Transport-Security, Referrer-Policy. Їхній прямий вплив на видимість в AI помірний, але вони є в кожному чеклисті технічної якості, а деякі статичні хостинги не вміють віддавати кастомні заголовки взагалі.
Стандартне рішення — поставити CDN-проксі перед хостингом і додати заголовки там. Це працює. І це відкриває дві пастки.
Пастка перша: проксі пропонує заблокувати AI-краулерів, і за замовчуванням — так
Під час налаштування наш CDN показав панель керування AI-ботами: пошукові краулери, агентські, тренувальні. Рекомендованим значенням для тренувальних було блокувати, з додатковим перемикачем — увімкненим за замовчуванням, — який автоматично вписує ці заборони в robots.txt.
Вдумайтеся. Наш robots.txt явно вітає кожного AI-краулера. Наш блог доводить, що бізнесу варто їх впускати. А інфраструктурний шар був за один клік від того, щоб перекреслити все це, тихо переписавши файл.
Для видавця, який захищає оригінальні матеріали, блокування тренувальних краулерів — позиція, яку можна відстоювати. Для будь-якого бізнесу, що хоче бути знайденим і рекомендованим AI-асистентами, це самосаботаж — і стається він на рівні, який після налаштування майже ніхто не переперевіряє.
Що робити: після будь-якої зміни на CDN чи в безпеці запросіть власний robots.txt через публічний інтернет і прочитайте його. Не файл у репозиторії — той, який реально віддає ваш домен. Вони можуть відрізнятися, і з редактора цю різницю не видно.
Пастка друга: суворий CSP вбиває inline-обробники подій
Ми свідомо задали сувору політику безпеки контенту: script-src 'self' плюс один домен аналітики, без 'unsafe-inline'. Перевірили сайт на inline-блоки <script>, не знайшли жодного і випустили.
За два тижні перемикач мов перестав працювати.
Перемикач був <select onchange="location.href=this.value">. Атрибут-обробник події — це теж inline-скрипт, і та сама директива його блокує. Гучної помилки не буде. Обробник просто не реєструється: консоль чиста, елемент в інспекторі виглядає нормально, а на взаємодію нічого не відбувається.
Збій був ще й відкладеним. Код не змінювався тижнями; він зламався тієї миті, коли заголовки пішли в бій. У журналі деплою на причину не вказувало ніщо.
Правильне і неправильне виправлення. Спокуслива поправка — додати 'unsafe-inline' до script-src. Один рядок, усе працює, і ви щойно скасували головну користь від політики, яку встановлювали.
Правильна поправка — перенести обробник у наявний файл скрипта:
document.querySelectorAll("select.lang-select").forEach(function (sel) {
sel.addEventListener("change", function () {
if (this.value) location.href = this.value;
});
});
Політика лишається суворою, функція працює. Inline-атрибути style не постраждали — style-src це окрема директива, і вона може зберігати 'unsafe-inline', не послаблюючи захист скриптів.
Як написати CSP, що не ламає ваш сайт
Політика, скопійована з чеклиста, заблокує щось потрібне. Наша мала пропустити три зовнішні джерела: скрипт аналітики, точку, куди він надсилає дані, і воркер, що приймає заявки з форм. Узагальнений default-src 'self' тихо вбив би і аналітику, і збір лідів.
Практична послідовність:
- Складіть перелік того, що сторінки реально завантажують. Скрипти, шрифти, зображення і кожну точку, до якої звертається ваш JavaScript.
- Прогрепайте шаблони на атрибути
on*=. Кожен із них зараз перестане працювати. - Задеплойте і проклікайте живий сайт із відкритою консоллю. Кожне порушення друкує назву директиви — вона й підкаже, що додати.
- Перевіряйте те, що надсилає, а не лише те, що відображається. Форми ламаються інакше, ніж макети.
Загальний висновок
Зміни в інфраструктурі невидимі у вашій кодовій базі. Ніщо в репозиторії не фіксує, що додали заголовки, тож коли за два тижні щось ламається, причина лежить не там, де її шукатимуть.
Після будь-якої зміни на цьому рівні перевірте три речі з публічного інтернету: чи robots.txt читається як задумано, чи заголовки відповіді саме такі, як ви задали, і чи працюють інтерактивні елементи. Десять хвилин — і ви ловите саме той клас збоїв, який інакше залишається непоміченим місяцями.
Хочете знати, як AI-асистенти бачать ваш сайт? Пройдіть безкоштовну перевірку — у відповідь підсумок того, що ChatGPT, Perplexity і Gemini зараз кажуть про ваш бізнес.
Перевірити мій сайт безкоштовноЧитайте також
AI-краулери: які боти читають ваш сайт і як перевірити, що вони можуть
GPTBot, ClaudeBot, PerplexityBot, Google-Extended — що робить кожен AI-краулер, як перевірити, чи не блокуєте ви їх випадково, і кого варто пускати.
Від 53 до 71: що насправді зрушило нашу власну GEO-оцінку
Через два тижні після публікації власного аудиту з оцінкою 53/100 ми провели його знову: 71/100. Чесний розбір того, які виправлення зрушили цифру, які не дали нічого, і що досі зламано.