Adsense广告在主题导航或目录页面上未重新加载,frame-src拒绝CSP错误和未捕获的异常错误 EmberJS

我在 https://howtodiscuss.com 的 Discourse 网站上运行广告时遇到了很多问题。

  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 代码:

/* 用于固定广告 */
/* 时间线布局修复 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 广告插件代码中存在另一个 bug:当我从一个页面导航到另一个页面时,我的 AdSense 广告代码从未刷新或重新加载,因此不会触发任何广告展示。可能是因为 Discourse 在导航时不会完全重新加载整个页面。我希望广告能够刷新,并且通过任何链接导航都能重新加载整个页面,该如何修复?

  2. 我的网站上还出现了许多此类 frame-src 错误,例如:https://howtodiscuss.com/t/how-mouthwash-rinse-become-a-necessary-step-in-oral-hygiene/30631

拒绝加载框架 'https://pagead2.googlesyndication.com/',因为它违反了以下 Content Security Policy 指令:"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

据我所知,您需要确保 Cloudflare 针对 JavaScript、CSS 和 HTML 的速度/性能优化已禁用,以便其与 Discourse 正常工作。

3 个赞

感谢 @simon 的迅速回复。

按照您的建议,我已关闭 Cloudflare、Brotli,并关闭了所有针对 CSS、JS 和 HTML 的压缩功能,同时也关闭了 Rocket Loader。

我还清除了 CF 缓存,并等待了 30 分钟以测试效果,但在访问我的主页 https://howtodiscuss.com 时,JS 控制台仍然出现奇怪的错误:

在导航到话题页面 Catholic rosary - How To Discuss 时也是如此:

您可以在 Chrome 无痕模式下打开我的网站并尝试导航到几个页面/话题,即可复现这些错误。

另外,您是否知道为什么我固定在话题时间线/话题导航右侧的 AdSense 广告,只有在完全刷新页面(使用浏览器刷新图标)或首次访问网站时才会显示,而在后续页面加载时该功能无法触发广告?它似乎无法检测到话题页面已更改。

它每次都进入这个 else 代码块。我的自定义 Discourse 插件逻辑中是否存在检测用户导航到话题页面的 bug?我希望每次导航时都能显示并重新加载新的 AdSense 广告,但它却进入了 else 分支。代码认为 ID #friends 已存在,但除非我进行完整的硬刷新,否则它从未重新加载。超时已清除,放弃了。

请帮帮我。您可以自行浏览我的网站话题,会在 JS 控制台中发现所有问题。我在 JS 控制台中还收到了这个警告,Google 的展示广告用户始终无法点击。

弃用通知:一次性移除所有事件监听器已被弃用,请逐个移除每个监听器。

我已经按照您的建议关闭了 CF 的速度优化功能,包括 CSS/JS/HTML 压缩、Rocket Loader 和 Brotli。现在还有什么问题吗?会不会是某个 Discourse 插件导致的?这是我当前启用的插件:

我的 SSL 设置为严格模式,这会是问题所在吗?

我还刚刚重新构建了一次,以防构建后变更生效……但错误依旧,刚刚又测试了一次 :frowning:

2 个赞