更新
好的 - 我现在知道多页加载的来源! (然而,这个谜尚未解决) .
It seems that immediately after a request is made to a page containing AdSense ads, Google makes a request for exactly the same URL (one or more times)
例如这就是日志的样子(注意来自Mediapartners-Google的请求):
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没有表现出任何奇怪的东西 .
So the question for the bounty now becomes:
-
Why is google making these requests so quickly after the page is requested? (我知道他们需要评估内容的页面,但是之后立即对我进行多次滥用 . )
-
What can I do to stop this?
出于兴趣:
- 还有其他人在他们的日志中看起来有类似的东西吗? (或者这个我的AdSense帐户有点奇怪)
好的,我会事先为这个长度道歉!...
对于 Google Adsense Javascript code causing errors ,此问题适用于this one . (形式 Unable to post message to googleads.g.doubleclick.net. Recipient has origin something.com
)
我不会复制那里的所有信息,但结论似乎是AdSense JS是错误的 . (如果你有时间,请阅读背景问题) . 我已经知道这个问题已经有一段时间了,但我决定忍受JS错误,而不是从网站上拉AdSense .
但是, Recently I noticed that in my ASP.NET MVC2 application, Controller Actions seemed to be called twice per page request (sometimes even 3 times). Odly,它只发生在 生产环境 服务器上 . After some thought I relalised that one difference between the Dev and Production environments was that the AdSense javscript was only active in production.
为了测试这一点,我从其中一个 生产环境 页面中删除了所有的adsense代码,并且看到,多页面加载问题就消失了!
我认为也许是因为页面上存在导致问题的一般JS错误,所以为了测试这个,我在我自己的JS代码中引入了一些简单的错误,但是 this did not cause the multiple-page-load problem to reappear .
每个请求可以多次调用页面的一种已知情况是,存在具有空src属性的图像标记,或具有空src属性的外部资源引用 . 至关重要的是,AdSense JS Bug问题最受欢迎的答案指出:
“此调用中的targetOrigin参数,this.la设置为http://googleads.g.doubleclick.net . 但是,新的iframe是在src设置为about:blank的情况下编写的 . ”
这似乎与空的src问题非常类似......这似乎太过共同发生,而且目前我认为这是问题所在 . [编辑:这是一个红鲱鱼]
However, I've no idea wehre to go from here. 这些多个动作调用引起了真正的问题(鉴于AdSense无处不在,以及问题的性质,我无法找到任何其他参考资料(但是我很困惑)同样令人惊讶的是 . 我希望这对我来说是一个愚蠢的错误,所以我需要进行健全检查 .
I'd like to ask the community:
-
Has anyone else experienced this problem?, or can anyone who is using AdSense replicate and confirm it? [See note below]
-
Assuming the problem is what it seems, what can I do? (other than pulling AdSense of course)
-
If not, then what might be causing this?
To Sumarise: - 我的操作每页请求执行2次(有时3次) .
-
只有GOOGLE ADSENSE ADS出现时才会发生这种情况
-
我删除了所有AdSense JS并在我自己的JS中引入了错误:只调用一次操作...
-
当页面上出现空的src属性时,可能会发生类似的问题
-
对上一个问题的回答表明,AdSense JS在iFrame上设置了src =“about:blank”
-
我得出的结论是,AdSense代码中的src =“about:blank”是问题的最可能来源 .
-
如果我在浏览器上禁用JavaScript,问题就会消失
Just to document the things I have ruled out:
-
这在各种浏览器中都有发生:Chrome(12)Firefox(5)和IE(8) .
-
我已经在浏览器上禁用了所有插件(YSlow,Firebug等......)
-
我的代码中的html中没有空的src(
src=""
/src="#"
)图像或其他外部资源 -
css中没有空的url引用(
url('')
) -
它发生在开发中(开发和 生产环境 之间的一些差异是Dev中没有AdSence JS)
Note: 对于任何想要复制它的人,应该注意到,奇怪的是,当多个动作调用发生时,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>
这是由View中的RenderPartial插入的:
<% Html.RenderPartial("AdSense_XXXXXX"); %>
TCP Logging (@Tomas)
到目前为止,我已经做了一个wireshark捕获:
客户端上的
- 请求有问题的 生产环境 页面
客户端 - 请求 生产环境 页面没有问题(即删除了Adsense)
我真的看不出两者之间的显着差异(虽然我的网络技能不是很好) . 需要注意的一点是,它们在初始请求之后似乎都有一个HTTP请求 TCP retransmittion
- 我不知道它的重要性 . 我可以确认,虽然在案例1中服务器日志报告了2次执行,而在案例2中只有一次执行 .
接下来,我将在两种情况下尝试在服务器端进行TCP日志记录,并在此处发布结果 .
4 回答
鉴于您观察到的行为似乎难以避免,我们是否可以专注于解决方法?
您能否根据UserAgent区分请求,从而过滤掉请求 . 这对你来说可行吗?如果是这样,那么你可能会基于这种方法:http://blog.flipbit.co.uk/2009/07/writing-iphone-sites-with-aspnet-mvc.html这里他们检测到iPhone,但是对于Mediapartners-Google bot来说,这个概念是相同的 .
Mediabot是Google用于抓取网页以分析内容的网页抓取工具的名称,因此Google AdSense可以向网页提供与内容相关的广告 .
根据我的经验,这是不可预测的,是的,它可以是heavy和annoying .
如果您不希望Mediapartner bot访问特定页面,您可以在
robots.txt
中禁止它:这将具有来自该特定页面的服务无目标广告的缺点 .
如果您看到此模式始终在具有不同查询字符串的同一页面上,则添加canonical rel可以减轻痛苦 .
如果你能't resolve this issue, and you see it as an abuse, don' t esitate在Crawling Indexing and Ranking Google support寻求帮助 .
除了嵌入AdSense代码本身之外,有两件与AdSense相关的内容在您的两个测试用例中有所不同:
!HttpContext.Current.IsDebuggingEnabled
会发生什么?这似乎是事实上的 生产环境 标志;也许还有一些其他的细微差别正在发生,这取决于同一个国旗 .是否有可能
Html.RenderPartial("AdSense_XXXXXX")
以某种方式导致您的Controller跳回其执行的开始?根据您的描述,似乎执行在服务器上发生了两次,但只有一个请求从客户端发送 . 这意味着服务器错误,这两行是您触发AdSense的关键 . 要进一步缩小范围,请尝试直接嵌入AdSense部分,而不是调用
Html.RenderPartial()
. 如果这不会改变结果,那么可能值得对HttpContext.Current.IsDebuggingEnabled
上的其他开关进行健全性检查 .如果做不到这一点,了解服务器端日志记录是在收到请求,发送响应之前还是在发送响应之后进行的,都可能会有所帮助 .
是的,我刚刚在与我的合作伙伴的TeamView会话中检测到了这一点 . 在我的盒子上,我的主页面仅为我的网站每个请求加载一次 .
然后巧合的是,在使用Fiddler时,我的合作伙伴正在向示例页面收到4个请求 . 它是一个1.5 MB的页面,包含大脚本和许多其他依赖项,所以这真的是一个WTF时刻,因为我在15年的Web开发中从未见过这样的东西 .
如果谷歌这样做,我必须说他们应该意识到今天的网站可能有非常大的网页和非常大的 Spectator . 这可能意味着他们每个请求的带宽增加了4倍 . 就像我说的,WTF ?????
我希望这个Q&A有更明确的解决方案 . 我确实使用谷歌翻译小部件,但这只发生在他的盒子和主页面上 . 其他页面也使用翻译小部件,我通过谷歌CDN请求我的JQUERY . Google可以做任何事吗 .