EmberJSでトピックナビゲーションや目次ページでAdsense広告が再読み込みされず、frame-src refused CSPエラーと例外エラーが発生

Discourse サイト (https://howtodiscuss.com) で広告を表示させる際に、多数の問題に直面しています。

  1. 多くの捕捉されていない DOM 例外エラーが発生しています。シークレットモードで任意のトピックページに移動すると確認できます: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 コードは以下の通りです:

/*固定広告用*/
/* timeline layout fix 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

ToC ページでも表示されるように、私のコードの誤りを修正していただけないでしょうか?

  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(コンテンツセキュリティポリシー)設定は以下のようになっています。

しかし、Google 広告の iframe リクエストをホワイトリストに追加する方法がわかりません。また、以下のコードを試しましたが、うまく動作せず、上記の frame-src エラーが依然として表示されています。
meta タグの frame-src の次に値を追加すると、「meta タグでは 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

Discourse と正しく連携させるためには、Cloudflare の JavaScript、CSS、HTML に対する速度/パフォーマンス最適化を無効にする必要があると理解しています。

「いいね!」 3

@simon さん、迅速なご対応ありがとうございます。

ご助言通り、Cloudflare と Brotli を無効化し、CSS、JS、HTML のすべての最小化機能をオフにしました。また、Rocket Loader も無効化しました。

さらに CF のキャッシュをクリアし、30 分待って結果を確認しましたが、ホームページ https://howtodiscuss.com で依然として奇妙な JS コンソールエラーが発生しています。

トピックページ(https://howtodiscuss.com/t/catholic-rosary/18598)に移動した際も同様です。

これらのエラーは、Chrome のシークレットモードで当サイトをオープンし、いくつかのページやトピックに移動することで再現可能です。

また、トピックのタイムライン/ナビゲーションの右側にある固定の AdSense 広告について質問です。なぜか、ブラウザのリロードアイコンを使ってページを完全に再読み込みした場合、または最初にサイトへアクセスした場合のみ表示されますが、その後のページ読み込みでは機能が作動せず、広告が表示されません。トピックページが切り替わったことを検知できていないようです。

常にこの else ブロックに入ってしまいます。カスタム Discourse プラグインのロジックに、ユーザーがトピックページに移動したことを検知するバグがあるのでしょうか?私は、トピックページが変わるたびに新しい AdSense 広告を表示・再読み込みしたいのですが、常に else ブロックに入ってしまいます。コードは ID #friends が既に存在すると判断していますが、完全なハードリフレッシュを行わない限り再読み込みされません。タイムアウトがクリアされ、あきらめました。

お手数ですが、ご支援をお願いします。ブラウザから当サイトのトピックをご覧いただければ、JS コンソールにすべての問題が表示されていることが確認できるはずです。また、JS コンソールには以下の警告も表示されており、Google のビネット広告がユーザーがクリックするまで表示されません。

Deprecation notice: Removing all event listeners at once is deprecated, please remove each listener individually.

ご提案通り、CF の速度最適化機能(CSS/JS/HTML の最小化、Rocket Loader、Brotli)をすべて無効化しました。他に考えられる問題はありますか?Discourse プラグインが原因でしょうか?現在インストールされているプラグインは以下の通りです。

SSL は「Strict」設定ですが、これが原因でしょうか?

念のため、設定変更が反映されるか確認して再ビルドも実施しましたが、エラーは変わらず、再度テストしました :frowning:

「いいね!」 2