Реклама AdSense не обновляется при навигации по темам или на страницах ToC: ошибки CSP frame-src refused и необработанные исключения EmberJS

У меня возникло множество проблем с показом рекламы на сайте Discourse по адресу https://howtodiscuss.com.

  1. Множество необработанных ошибок DOM Exception. Просто перейдите на любую страницу темы в режиме инкогнито, и вы их увидите: https://howtodiscuss.com/t/profit/7022

  1. Другая ошибка возникает при переходе с одной страницы темы на новую: в консоли появляется предупреждение, показывается реклама Google Vignette, но из-за этого предупреждения реклама исчезает, и происходит переход по странице. В результате пользователь никогда не может кликнуть по межстраничной рекламе Google Vignette, которая появляется между загрузками/переходами страниц.

    Уведомление об устаревании: одновременное удаление всех слушателей событий устарело, пожалуйста, удаляйте каждый слушатель индивидуально. How many ounces is a 1 4 cup - How To Discuss

  1. Я также пытаюсь показать фиксированную «липкую» рекламу Google в правой боковой панели на странице отдельной темы, используя этот код,

JavaScript-код для вставки фиксированной липкой рекламы в боковую панель темы, необходимо заставить его работать вместе с оглавлением (ToC)

<!-- код плагина для показа фиксированной рекламы -->

<script type = "text/discourse-plugin"
version = "0.8" >
	var friends_retries = 0;
var friends_timeout;

api.decorateWidget('topic-timeline-container:before', helper => {
	return helper.h('div.side-block', [
		helper.rawHtml('<div id="friends"></div>'),
	]);
});

api.onPageChange(() => {


	if (window.location.href.indexOf("/t/") > -1) {
		console.log('page changed - topic');
		friends_retries = 0;
		window.setTimeout(loadFriends, 100);

	} else {
		//console.log( 'page changed - not topic');
	}
});

function loadFriends() {

	if (!document.getElementById('friends')) {
		//var timer;
		friends_retries++;
		if (friends_retries < 10) {
			//console.log('timeout rescheduled, try ' + friends_retries);
			window.setTimeout(loadFriends, 100);
		} else {
			clearTimeout(friends_timeout);
			// window.clearTimeout(loadFriends);

			console.log('timeout cleared, gave up');
			// loadFriends();
		}
	} else {


		var bHTML = ' <!-- Topic side bar timeline HTD --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-7087907313091932" data-ad-slot="5067761793" data-ad-format="auto" data-full-width-responsive="true"></ins>';

		// var bHTML = '<img src="https://via.placeholder.com/300x250?text=300x250+MPU" alt="Girl in a jacket">';

		$("#friends").html(bHTML);


	}
}


</script>
<!-- код плагина для показа фиксированной рекламы -->

Вот его CSS-код:

/* для фиксированной рекламы */
/* исправление макета таймлайна 2.6.0.beta5 */
@media screen and (min-width: 925px) {
    .container.posts .topic-navigation {
        margin-left: 7em;
    }
}

#friends {
    display:block;
    //width:300px; 

    height:150px;
    margin-left:-90px;
    margin-top:-25px;
    margin-bottom:90px;
}
/* для фиксированной рекламы */

Иногда этот код работает, но не работает на страницах, где отображается оглавление (ToC), например, не работает на How Many Grams In A Quarter Ounce? - How To Discuss

Может ли кто-нибудь исправить мою ошибку в коде, чтобы он показывался и на страницах с оглавлением?

  1. Я также заметил ещё одну ошибку в своём коде и в целом в коде плагина рекламы Discourse: при переходе с одной страницы на другую мой код рекламы AdSense никогда не обновляется и не перезагружается, поэтому не срабатывает ни одно показ рекламы. Возможно, это связано с тем, что Discourse не полностью перезагружает всю страницу при навигации. Я хочу, чтобы реклама обновлялась, а полная страница перезагружалась при переходе по любой ссылке. Как это исправить?

  2. На моём сайте также появляется множество ошибок frame-src: https://howtodiscuss.com/t/how-mouthwash-rinse-become-a-necessary-step-in-oral-hygiene/30631

Refused to frame 'https://pagead2.googlesyndication.com/' because it violates the following Content Security Policy directive: "frame-src cm.g.doubleclick.net googleads.g.doubleclick.net www.google.com accounts.google.com pagead2.googlesyndication.com/pagead/s/cookie_push.html gmsg: https://tpc.googlesyndication.com/sadbundle/$csp=er3$/1522577804659956528/index.html".

Вот как выглядят мои настройки CSP:

Но я не знаю, как добавить в белый список запросы iframe от рекламы Google? Я также пробовал этот код, но он работает плохо, и я всё ещё вижу вышеуказанные ошибки frame-src. Если я добавляю значения рядом с frame-src в мета-теге, мне выдаётся ошибка, что нельзя использовать frame-src в мета-теге.

<!--<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' http://* 'unsafe-inline'; frame-src  ; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'" />-->

Это была бы огромная помощь, если бы кто-то мог помочь мне решить мои проблемы:

Я также получаю такие ошибки на главной странице: https://howtodiscuss.com/ (чтобы воспроизвести ошибки, откройте страницу в режиме инкогнито, используйте VPN или просто обновите страницу несколько раз или перейдите на другие страницы; вы найдёте ошибки в консоли JS и также увидите, как реклама Google Vignette исчезает, не давая пользователю возможности кликнуть по ней).

Надеюсь, кто-то сможет помочь.

Мой сайт находится на Cloudflare, я использую последнюю версию Discourse 2.6.0.beta6, обновил все плагины и только что пересобрал Docker. Несмотря на это, я всё ещё вижу эти ошибки.

Возможно, это является причиной проблем, с которыми вы столкнулись. Ознакомьтесь с темами поддержки, связанными с Cloudflare, чтобы узнать, содержат ли они какие-либо подсказки о проблемах конфигурации Cloudflare, которые могут вызывать эти проблемы: Search results for 'cloudflare #support' - Discourse Meta.

Насколько мне известно, необходимо отключить оптимизации скорости/производительности Cloudflare для JavaScript, CSS и HTML, чтобы он корректно работал с Discourse.

Спасибо, @simon, за быстрый ответ.

По вашему совету я отключил Cloudflare, Brotli, а также все функции минификации для CSS, JS и HTML. Также я отключил Rocket Loader.

Я также очистил кэш Cloudflare и выждал 30 минут для проверки результатов, но на моей главной странице https://howtodiscuss.com по-прежнему появляются странные ошибки в консоли JS:

А при переходе на страницы тем, например https://howtodiscuss.com/t/catholic-rosary/18598:

Вы можете воспроизвести эти ошибки, открыв мой сайт в режиме инкогнито Chrome и перейдя по нескольким страницам/темам.

Также, не знаете ли вы, почему моя закрепленная реклама AdSense справа от временной шкалы темы/навигации по теме отображается только при полной перезагрузке страницы через кнопку обновления браузера или при первом заходе на сайт? При последующих переходах между страницами функция не срабатывает — она не определяет, что страница темы изменилась.

Каждый раз код попадает в блок else. Есть ли ошибка в логике моего кастомного плагина Discourse, отвечающего за определение перехода пользователя на страницу темы? Я хочу показывать и перезагружать новую рекламу AdSense при каждом переходе, но код уходит в блок else, полагая, что элемент с ID #friends уже существует. Однако он не перезагружается, если не выполнить полную жесткую перезагрузку страницы. Таймаут истёк, сдались.

Пожалуйста, помогите. Вы можете сами просмотреть темы на моём сайте — все проблемы видны в консоли JS. Также я получаю следующее предупреждение в консоли JS, и рекламный блок Google Vignette никогда не остаётся достаточно долго, чтобы пользователь мог на него нажать.

Предупреждение об устаревании: одновременное удаление всех слушателей событий устарело, пожалуйста, удаляйте каждый слушатель отдельно.

Я отключил оптимизации скорости Cloudflare, как вы и советовали: минификацию CSS/JS/HTML, Rocket Loader и Brotli. Что ещё может быть причиной? Может ли проблема быть в плагине Discourse? Вот список моих текущих плагинов:

Мой SSL настроен в режиме «Strict». Может ли это быть проблемой?

Я также только что выполнил полную пересборку, на случай если изменения вступят в силу после неё… но ошибки остаются прежними. Только что проверил снова :frowning: