토픽 이동 또는 목차 페이지에서 AdSense 광고가 다시 로드되지 않음, frame-src 거부 CSP 오류 및 EmberJS 미처리 예외 오류

Discourse 사이트 https://howtodiscuss.com에서 광고를 실행하는 데 여러 가지 문제가 있습니다.

  1. 많은 수의 미처리된 DOM 예외 오류가 발생합니다. 인코그니토 모드로 아무 주제 페이지나 방문하면 이를 확인할 수 있습니다: https://howtodiscuss.com/t/profit/7022

  1. 또 다른 오류는 오래된 주제 페이지에서 새로운 주제로 이동할 때 콘솔에 경고가 표시되는 것입니다. Google Vignette 광고가 표시되지만 이 경고로 인해 광고가 사라지고 페이지가 이동하므로, 사용자가 페이지 로드/이동 사이에 나타나는 Google Vignette 인터스티셜 광고를 클릭할 기회가 전혀 없습니다.

    Deprecation notice: Removing all event listeners at once is deprecated, please remove each listener individually. How many ounces is a 1 4 cup - How To Discuss

  1. 또한 아래 코드를 사용하여 단일 주제 페이지의 오른쪽 사이드바에 고정된 스티키 Google 광고를 표시하려고 하고 있습니다.

주제 사이드바에 고정된 스티키 광고를 삽입하기 위한 자바스크립트 코드, 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 에서 작동하지 않습니다.

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를 다시 빌드했습니다. 여전히 이러한 오류가 보입니다.

이것이 문제가 발생하는 원인일 가능성이 있습니다. 클라우드플레어 설정 문제로 인해 문제가 발생하고 있는지 확인하기 위해 클라우드플레어 관련 지원 주제를 살펴보세요: Search results for 'cloudflare #support' - Discourse Meta.

제 이해에 따르면, Discourse와 올바르게 작동하려면 JavaScript, CSS 및 HTML에 대한 클라우드플레어의 속도/성능 최적화 기능을 비활성화해야 합니다.

@simon님, 빠른 답변 감사합니다.

말씀하신 대로 Cloudflare, Brotli를 끄고 CSS, JS, HTML의 모든 미니파이어(minification) 설정도 해제했으며, Rocket Loader도 비활성화했습니다.

또한 CF 캐시를 비우고 30분간 대기 후 결과를 테스트했지만, 홈페이지 https://howtodiscuss.com에서 여전히 이상한 JS 콘솔 오류가 발생하고 있습니다.

토픽 페이지로 이동할 때에도 마찬가지입니다. Catholic rosary - How To Discuss

크롬 인코그니토(비공개) 창에서 제 사이트를 열고 몇몇 페이지/토픽으로 이동해 보시면 이 오류들을 재현해 보실 수 있습니다.

또한, 토픽 타임라인/토픽 내비게이션 오른쪽에 있는 고정된(sticky) AdSense 광고가 브라우저 새로고침 아이콘을 사용하여 페이지를 완전히 새로고침할 때나 웹사이트에 처음 접속할 때만 표시되는 이유가 무엇인지 아시나요? 이후의 페이지 로드에서는 광고 기능이 트리거되지 않고, 토픽 페이지가 변경된 것을 감지하지 못합니다.

항상 이 else 블록으로 진입하는데, 사용자가 토픽 페이지로 이동했음을 감지하는 제 커스텀 Discourse 플러그인 로직에 버그가 있는 건가요? 매번 새로운 AdSense 광고를 표시하고 새로고침하고 싶은데, else 블록으로 가고 있습니다. 코드는 ID #friends가 이미 존재한다고 판단하지만, 완전한 하드 리프레시(FULL HARD REFRESH)를 하지 않는 한 절대 새로고침되지 않습니다. timeout cleared, gave up.

도움을 부탁드립니다. 직접 제 웹사이트 토픽을 브라우저로 확인해 보시면 콘솔 JS에서 모든 문제를 발견하실 수 있을 것입니다. 또한 JS 콘솔에서 이 경고도 받고 있으며, 구글 비네트(vignette) 광고가 사용자가 클릭할 수 있을 정도로 유지되지 않습니다.

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

제안해 주신 대로 CF 속도 최적화 설정(css/js/html 미니파이어, 로켓 로더, 브로틀리)을 모두 해제했습니다. 이제 무엇이 문제일 수 있을까요? Discourse 플러그인이 문제일 수 있을까요? 현재 사용 중인 플러그인 목록은 다음과 같습니다.

SSL이 엄격(strict)하게 설정되어 있는데, 이것이 문제가 될 수 있을까요?

변경 사항이 리빌드 후에 적용될 수 있을까 봐 방금 신선한 리빌드(fresh rebuild)도 수행했습니다. 하지만 오류는 여전히 동일합니다. 방금 다시 테스트해 봤는데 :(,