Хорошо… всё ещё пытаюсь настроить отображение моего рекламного сервера на Discourse. Наткнулся на загадку, которую не могу разгадать. Используя функцию редактирования темы, я добавил свой скрипт-запрос и в </body>, и в ‘footer’.
Если добавить его в footer (или ‘after header’), код не работает. Хотя в режиме инспекции закодированный текст, кажется, корректен. См. ниже:
Также я пока не могу заставить работать мои объявления Adsense отдельно, но, возможно, это проблема на их стороне, и они просто ещё не просканировали сайт, чтобы понять, что разместить. Странно, что это занимает так много времени.
Можно попросить модератора переместить это в раздел поддержки или в другую подходящую категорию? Я оставил это без категории.
Спасибо. И извините, что так настойчиво прошу об этом, но у меня скоро дедлайн по развёртыванию, и мне действительно нужно разобраться с этой проблемой.
Хорошо, я заметил, что в логе CSP указывалось, что скрипт Google Ads блокируется, поэтому я добавил
https://pagead2.googlesyndication.com
в список script-src для CSP, и после этого мои объявления Google AdSense начали отображаться (немного удивило, что всё ещё приходится это делать, даже при установленном плагине AdSense). Однако я заметил, что когда мои внутренние объявления (House Ads) установлены на 100% (то есть вызывается только мой скрипт), в CSP нет никаких уведомлений о проблемах. Это возвращает меня к полной растерянности. Код внутренних объявлений находится в HTML (закодирован) и отображается в браузере так, как показано выше.
Неужели что-то блокирует вывод, но не вызывает предупреждение CSP?
Вывод использует document.write для создания места под рекламу. Я предполагаю, что проблема именно в этом. Вывод выглядит так:
Так что… это всё связано с CSP (я так полагаю), потому что для сайта установлено значение ‘unsafe-inline’, а я пытаюсь загрузить скрипт моего рекламного сервера по URL с переменными. Знаю… как это варварски с моей стороны.
Так что… кто-нибудь? Есть ли простое решение этой проблемы, или мне просто сдаться?
Правильное решение — не использовать inline-код, а переписать его так, чтобы он интегрировался с существующими слотами шаблонов EmberJS. Если вам нужно временное решение, вы можете отключить CSP в настройках сайта, пока работаете над изменениями в вашем кастомном решении для рекламы. Однако имейте в виду, что это может подвергнуть вас риску XSS-атак.
Также, где объявлена политика безопасности контента? Я не вижу для неё никакого мета-тега. Это просто настройки по умолчанию HTML5, предполагаемые каждым браузером?
Спасибо, Фалько. Вместо того чтобы просто отключать всю защиту, есть ли способ добавить в белый список строки данных только для URL-адреса рекламного сервера и разрешить передачу этих переменных? Или… просто отключить требование «unsafe-inline» для данных?
К сожалению, в статье, на которую вы дали ссылку, этот вариант не описан.
И всё же реклама не отображается в основной части сайта, только в подвале, где она установлена в теме внутри тега </body>. Я заметил, что центральный секция обернута в тег <noscript>, а код в подвале находится за пределами закрывающего тега </noscript>, возможно, поэтому?
Я проверил в Firefox, и теперь в консоли нет предупреждений о CSP. Не понимаю, почему я изначально не видел их в Chrome.
Discourse — это одностраничное приложение, и вся разметка страниц создаётся на стороне клиента с помощью нашего приложения на EmberJS.
Прямая манипуляция DOM, такая как document.write, вступает в прямое противоречие с архитектурой приложения и имеет крайне низкие шансы на то, что всё «просто заработает».
Я рекомендую адаптировать вашу рекламную систему для использования нашей системы House Ads в официальном плагине для рекламы. Возможно, вы сможете разместить одно объявление в инвентаре House Ads и использовать хук изменения страницы для обращения к рекламному серверу и замены объявления на полученный ответ? Или, возможно, ваша рекламная система может напрямую записывать данные в инвентарь House Ads через API?
Спасибо за помощь, Фалько. Немного страшно, но исходный код этого рекламного сервера был написан до появления термина API, так что… да, мне было бы лучше написать совершенно новую систему рекламного сервера с нуля. Просто у меня сейчас нет на это времени, так как я разворачиваю этот новый форум и 6+ новых сайтов с контентом.
Я попробую поэкспериментировать с альтернативными вариантами использования document.write и посмотрю, сработает ли это.