代码之家  ›  专栏  ›  技术社区  ›  Community wiki

Google AdSense JavaScript导致多页加载?

  •  12
  • Community wiki  · 技术社区  · 1 年前

    使现代化

    好的,我现在知道多页加载是从哪里来的!(然而,谜团尚未解开)

    看起来 紧接之后 对包含AdSense广告的页面进行请求, 谷歌请求完全相同的URL (一次或多次)

    例如,日志是这样的(注意来自媒体合作伙伴谷歌的请求):

    2011-07-20 09:50:20 xxx.xxx.xxx.xxx GET /requestedURL/ 80 - xxx.xxx.xxx.xxx Mozilla/5.0+(Browserstring removed) 200 0 0 1140
    2011-07-20 09:50:20 xxx.xxx.xxx.xxx GET /requestedURL/ 80 - 66.249.72.52 Mediapartners-Google 200 0 64 218
    2011-07-20 09:50:22 xxx.xxx.xxx.xxx GET /requestedURL/ 80 - 66.249.72.52 Mediapartners-Google 200 0 0 171
    

    (我本应该更多地关注IIS日志,而不是我自己的应用程序日志——只是我没有想到这些多个相同的同时请求可能来自不同的来源)。这也解释了为什么我在用WireShark分析请求时找不到任何奇怪的东西,以及为什么fiddler没有显示出任何奇怪的事情。

    因此,现在赏金的问题变成了:

    • 为什么谷歌在请求页面后这么快就提出了这些请求? (我知道他们需要评估页面内容,但是 立即 之后,以及 多次 我觉得这是一种虐待。)
    • 我该怎么办才能阻止这种情况?

    出于兴趣:

    • 其他人的日志中有类似的内容吗?(或者我的AdSense帐户有什么奇怪的地方)

    好的,我会提前为长度道歉!。。。

    这个问题被分配给 this one 关于 Google Adsense Javascript代码导致错误 .(形式 Unable to post message to googleads.g.doubleclick.net. Recipient has origin something.com )

    我不会重复那里的所有信息,但结论似乎是AdSenseJS有缺陷。(如果你有时间,请阅读背景问题)。 我知道这个问题有一段时间了,但我决定接受JS错误,而不是从网站上删除AdSense。

    然而 , 最近我注意到,在我的ASP.NET MVC2应用程序中,控制器操作似乎每个页面请求调用两次(有时甚至调用3次)。 不幸的是,它只发生在生产服务器上。 经过一番思考,我重新认识到开发环境和生产环境之间的一个区别是AdSense javscript只在生产中活动。

    为了测试这一点,我从一个生产页面上删除了所有的adsense代码,结果发现,多页面加载问题消失了!

    我想,也许是页面上有一些常见的JS错误导致了问题,所以为了测试这一点,我在自己的JS代码中引入了一些简单的错误 这并没有导致多页加载问题再次出现

    每个请求可以多次调用页面的一种已知情况是 image tags with empty src attributes ,或src属性为空的外部资源引用。至关重要的是,对 AdSense JS Bug question 注意:

    “此调用中的targetOrigin参数this.la设置为 http://googleads.g.doubleclick.net 然而,新的iframe 编写时,其src设置为about:black。“

    这似乎与空的惊人相似 src 问题 这似乎是一个太多的共同事件,目前我认为这就是问题所在。 [编辑:这是在转移注意力]

    然而,我不知道我们该从这里出发。 这些多操作调用造成了真正的问题(我不得不使用代码阻塞、串行化事务和各种讨厌的黑客来限制不利影响)。当然,我可能完全搞错了——考虑到AdSense的普遍性和问题的性质,我很困惑,我找不到任何其他参考资料(但AdSense JS Bug问题的结论也令人惊讶)。我希望这对我来说是一个愚蠢的错误,所以我需要一个理智的检查。

    我想问一下社区:

    • 其他人经历过这个问题吗?,或者任何使用AdSense的人都可以复制并确认它吗?[见下文注释]
    • 假设问题是看起来的,我该怎么办?(当然不是拉AdSense)
    • 如果没有,那么是什么原因导致了这种情况?

    致Sumrise: -每个页面请求执行2次(有时是3次)我的操作。

    • 只有当谷歌ADSENSE广告出现时才会发生这种情况
    • 我删除了所有AdSense JS,并在我自己的JS中引入了一个错误:操作只调用一次。。。
    • 当页面上存在空的src属性时,也可能出现类似的问题
    • 上一个问题的答案是,AdSense JS设置 src="about:blank" 在iFrame上
    • 我得出的结论是 src=“关于:空白” 来自AdSense代码是最有可能的问题来源。
    • 如果我在浏览器上禁用JavaScript,问题就会消失

    只是为了记录我排除的事情:

    • 这种情况在浏览器之间发生:Chrome(12)、Firefox(5)和IE(8)。
    • 我已经禁用了浏览器上的所有插件(YSlow、Firebug等)
    • 没有空的src( src="" / src="#" )对于我的代码中html中的图像或其他外部资源
    • css中没有空的url引用( url('') )
    • 这不太可能是服务器端的代码/配置问题,因为它在开发人员中不会发生(开发人员和生产人员之间的少数差异是开发人员中没有AdSence JS)

    注: 对于任何想要复制这一点的人来说,应该注意的是,奇怪的是,当多个操作调用发生时,Fiddler只显示一个请求被发送到服务器。我不知道为什么会出现这种情况,但服务器日志记录并没有撒谎:)也许有过img标签中空src属性导致此问题的经验的人可以说他们是否在Fiddler中看到过相同的行为。


    请求的额外信息

    HTML(@Ivan)

    以下是我如何实现Adsense(删除了id)

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <div class="ad">
    <%if (!HttpContext.Current.IsDebuggingEnabled) { %>
    <script type="text/javascript"><!--
    google_ad_client = "ca-pub-xxxxxxxxxxxxxxx";
    /* xxxxxxxxxxxxxxx */
    google_ad_slot = "xxxxxxxxx";
    google_ad_width = 728;
    google_ad_height = 15;
    //-->
    </script>
    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </script>                     
    <%} else { %>
    <img src="/Content/images/googleAdMock728x15_4_e.gif" width="728" height="15" />
    <%} %>
    </div>
    

    这是由视图中的RenderPartial插入的:

    <% Html.RenderPartial("AdSense_XXXXXX"); %>
    

    TCP日志记录(@Tomas)

    到目前为止,我已经完成了一个wireshark捕获:

    1. 在…上 客户 在上请求页面时 生产 有问题
    2. 在…上 客户 在上请求页面时 生产 没有问题(即Adsense已删除)

    我真的看不出两者之间有什么显著的区别(尽管我的网络技能不太好)。需要注意的一点是 二者都 似乎有 TCP retransmittion 在初始请求之后立即执行HTTP请求——我不知道这有什么意义。不过,我可以确认,在情况1中,服务器记录了2次执行,而在情况2中,只有一次执行。

    接下来,我将在这两种情况下尝试在服务器端进行TCP日志记录,并在此处发布结果。

    4 回复  |  直到 8 年前
        1
  •  4
  •   systempuntoout    8 年前

    Mediabot 是谷歌用来抓取网页以分析内容的网络爬虫的名称,这样谷歌AdSense就可以为页面提供与上下文相关的广告。

    根据我的经验,它是不可预测的,是的,它可能很漂亮 heavy annoying

    如果你不想让Mediapartner机器人访问特定页面,你可以在你的 robots.txt 与:

    #
    # disallow adsense bot
    #
    User-agent: Mediapartners-Google
    Disallow: path to your specific page
    

    这将有一个缺点,即来自该特定页面的服务无目标广告。

    如果您看到此模式总是在具有不同查询字符串的同一页面上,请添加 canonical rel 可以减轻疼痛。

    如果你不能解决这个问题,并且你认为这是一种虐待,不要在 Crawling Indexing and Ranking Google support

        2
  •  1
  •   Tomas    13 年前

    考虑到你观察到的行为似乎很难避免,我们能专注于变通办法吗?

    你能根据UserAgent区分请求,从而过滤掉请求吗。 这对你来说是可行的方法吗? 如果是这样,那么您可能会基于这种方法: http://blog.flipbit.co.uk/2009/07/writing-iphone-sites-with-aspnet-mvc.html 在这里,他们检测iPhone,但对于Mediapartners谷歌机器人来说,效果是一样的。

        3
  •  0
  •   Leo Accend    13 年前

    除了AdSense代码本身的嵌入之外,在您的两个测试用例中,还有两件与AdSense相关的事情不同:

    1. !HttpContext.Current.IsDebuggingEnabled ?这似乎是事实 生产 旗帜也许还有其他一些细微之处正在发生,这取决于同一面旗帜。

    2. 有可能吗 Html.RenderPartial("AdSense_XXXXXX") 是否以某种方式导致您的控制器跳回到其执行的开始?

    根据您的描述,服务器上的执行似乎发生了两次,但客户端只发送了一个请求。这意味着服务器错误,这两行是AdSense触发的关键。要进一步缩小范围,请尝试直接嵌入AdSense分部,而不是调用 Html.RenderPartial() 。如果这不能改变结果,那么可能值得对其他开关进行理智检查 HttpContext.Current.IsDebuggingEnabled

    如果不能做到这一点,那么了解服务器端日志记录是在收到请求时、发送响应之前还是在发送响应之后进行可能会有所帮助。

        4
  •  0
  •   Krafty    13 年前

    是的,我刚刚在与我的合作伙伴进行TeamView会话时检测到这一点。在我的盒子上,我的主页只为我的网站加载一次请求。

    巧合的是,在使用Fiddler时,我的合作伙伴收到了4个对样本页面的请求。这是一个1.5 MB的页面,包含大型脚本和许多其他依赖项,所以这真的是一个WTF时刻,因为我在15年的网络开发中从未见过这样的事情。

    如果谷歌这样做,我必须说,他们应该意识到今天的网站可能有非常大的页面和非常大的受众。这可能意味着他们会将每个请求的带宽提升4倍。就像我说的,WTF?????

    我希望这个问答;A有一个更明确的决议。 我确实使用谷歌翻译小部件,但这只发生在他的盒子和主页上。其他页面也使用翻译小部件,我确实通过谷歌CDN请求我的JQUERY。谷歌在做什么吗。