好的……我仍在努力让我的广告服务器在 Discourse 上显示。我遇到了一个无法解决的谜团。使用主题编辑功能,我已将我的脚本请求添加到了 </body> 和“页脚”中。
如果添加到页脚(或“页眉之后”),代码会失败。尽管在检查模式下,编码后的文本看起来是正确的。请见下图:
“这是哪里?”的文字出现了,但其他内容没有显示。
然而,同样的脚本请求(如下)添加到 </body> 却能正常工作。这是为什么呢?
<script language="Javascript" src="https://adserver.kitmaker.net/index.php?section=serve&action=1">
我也尝试将其添加到“房屋广告”数据字段中,但页面中虽然显示了编码后的数据,却没有任何效果。
creatives\";:{\"Leaderboard Ad\":\"<script language=\\\"Javascript\\\" src=\\\"https://adserver.kitmaker.net/index.php?section=serve&action=1\\\">\"}},\"
此外,我似乎也无法让 Google AdSense 广告单独正常工作。也许问题出在他们那边,他们可能还没有扫描网站以确定要展示什么内容。不过,这确实有点奇怪,竟然花了这么长时间。
感谢任何帮助。
Jim
能否请一位版主将此帖移至“支持”或其他合适的分类?我最初未进行分类。
谢谢。抱歉如此催促,但我即将面临部署截止日期,真的需要尽快解决这个问题。
好的,我注意到 CSP 日志显示 Google 广告脚本被阻止,因此我将
https://pagead2.googlesyndication.com
添加到了 CSP 的 script-src 列表中,之后我的 Google AdSense 广告就开始显示了(有点惊讶,即使安装了 AdSense 插件,仍然需要这样做)。不过我注意到,当我的自家广告设置为 100%(即只调用我的脚本)时,CSP 完全没有发出任何有关问题的通知。这让我又回到了困惑的状态。自家广告的代码在 HTML 中(已编码),在浏览器检查视图中显示如上。
是否有某种情况会阻止输出但不会触发 CSP 警告?
该输出使用 document.write 来创建广告位。我猜问题就出在这里。输出看起来像这样:
哈哈……如果我把脚本输出以文本形式放在这里,它本来是可以正常生成的。哎呀……
我找到了一个类似问题的帖子,但这位用户自己解决了问题,显然他的 JavaScript 水平比我高。
和他一样,我也愿意付费请人帮忙解决这个问题。
谢谢,
Jim
1 个赞
所以……这应该都是 CSP(内容安全策略)相关的问题(我猜),因为网站被设置为允许“不安全内联”数据,而我正尝试通过带变量的 URL 拉取我的广告服务器脚本。我知道……我这样做太原始了。
那么……有人知道吗?这个问题有简单的解决办法吗,还是说我干脆放弃算了?
Falco
(Falco)
6
正确的修复方法是避免使用内联方式,而是将其重写以接入现有的 EmberJS 模板插槽。如果您在寻找临时解决方案,可以在着手修改自定义广告方案的同时,在站点设置中禁用 CSP。但请注意,这可能会使您面临 XSS 攻击的风险。
您也可以考虑将您的服务器添加到 adplugin 的一个分支中,就像以下 PR 中所做的那样:Sign in to GitHub · GitHub https://github.com/discourse/discourse-adplugin/pull/65。
4 个赞
另外,内容安全策略(Content Security Policy)是在哪里声明的?我没看到相关的 meta 标签。这是否只是各浏览器默认采用的 HTML5 假设设置?
感谢 Falco。与其直接关闭所有保护,有没有办法仅针对广告服务器 URL 对白数据字符串,并允许这些变量通过?或者……直接关闭“不安全的内联数据”要求?
遗憾的是,您提供的文章中并未提及该选项。
再次感谢。
好吧,我想我大概是走投无路了,因为我确实尝试完全关闭 CSP……
但即便如此,广告仍然无法在站点的主区域显示,只能显示在页脚,因为它是安装在主题中的 </body> 标签里的。我后来意识到,中间部分被一个 <noscript> 标签包裹着,而页脚部分则位于 </noscript> 闭合标签之外,所以这也许就是原因?
我在 Firefox 中检查了一下,现在控制台不再显示任何 CSP 警告。我不太清楚为什么一开始在 Chrome 中从未看到这些警告。
Falco
(Falco)
11
Discourse 是一个单页应用,所有页面标记都是通过我们的 EmberJS 应用程序在客户端生成的。
直接使用 document.write 等 DOM 操作与整个架构直接冲突,几乎不可能“直接生效”。
建议您尝试将广告系统适配为我们的官方广告插件中的站内广告系统。或许您可以在站内广告库存中设置单个广告,然后利用页面切换钩子联系广告服务器,并根据响应替换广告?或者,您的广告系统是否可以通过 API 直接向站内广告库存写入内容?
2 个赞
感谢你的帮助,Falco。确实有点吓人,因为这个广告服务器的代码库是在“API”这个术语被提出之前编写的,所以……没错,我最好从头开始编写一个全新的广告服务器系统。但我现在没时间这么做,因为我正在部署这个新论坛以及 6 个以上的新内容网站。
我会尝试一些替代 document.write 的方案,看看是否可行。
祝好,
Jim
system
(system)
关闭
13
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.