Google AdSense JavaScript вызывает несколько загрузок страницы? - PullRequest
12 голосов
/ 16 июля 2011

Обновление

Хорошо - теперь я знаю, откуда происходит загрузка нескольких страниц!(Однако тайна еще не разгадана) .

Похоже, что сразу после делается запрос на страницу, содержащую рекламу AdSense, Google делаетзапрос на точно такой же URL (один или несколько раз)

например, вот как выглядят журналы (обратите внимание на запросы от 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 не показал ничего странного.

Таким образом, вопрос о вознаграждении теперь становится:

  • Почему Google делает эти запросы так быстро после запроса страницы? (я знаю, что им нужно оценивать страницу на предмет содержания, но сразу после,и несколько раз воспринимается как оскорбление со мной.)
  • Что я могу сделать, чтобы остановить это?

И из интереса:

  • Кто-нибудь еще видел что-то подобное в своих журналах?(или это что-то странное в моей учетной записи AdSense)

Хорошо, я заранее извинюсь за длину! ...

Этот вопрос адресован этому относительно кода Google Adsense Javascript, вызывающего ошибки .(в форме Unable to post message to googleads.g.doubleclick.net. Recipient has origin something.com)

Я не буду дублировать всю информацию там, но, похоже, делается вывод, что AdSense JS содержит ошибки.(пожалуйста, прочитайте вопрос для фона, если у вас есть время).Я знал об этой проблеме в течение некоторого времени, но решил жить с ошибками JS, а не извлекать AdSense с сайта.

Однако , Недавно я заметил это в моем ASP.Приложение NET MVC2, действия контроллера, казалось, вызывалось дважды за запрос страницы (иногда даже 3 раза). Как ни странно, это происходило только на рабочем сервере. После некоторых размышлений я понял, что одно из различий между средами разработки и разработки заключается в том, что javscript AdSense был активен только в рабочей среде.

Для проверки я удалил весь код AdSense из одной рабочейстраниц, и вот, проблема многостраничной загрузки исчезла!

Я подумал, что, возможно, именно тот факт, что на странице были общие ошибки JS, вызывал проблему, поэтому для проверки этого яввел несколько простых ошибок в мой собственный код JS, однако это не привело к повторному появлению проблемы загрузки нескольких страниц .

Одна известная ситуация, когда страницы могут вызываться несколько разна запрос приходится теги изображения с пустыми атрибутами src или ссылки на внешние ресурсы с пустыми атрибутами src.Важно отметить, что наиболее часто задаваемый ответ на вопрос об ошибке AdSense JS отмечает, что:

"Аргумент targetOrigin в этом вызове this.la имеет значение http://googleads.g.doubleclick.net.Однако новый iframe был написан с src, установленным в about: blank. "

Это похоже на пустую проблему src .... Это кажется слишкомбольшая часть совпадения, и в настоящее время я считаю, что это проблема. [РЕДАКТИРОВАТЬ: Это была красная сельдь]

Однако я не знаю, откуда нам идти. Эти множественные вызовы действий вызывают реальные проблемы (мне приходится использовать блокировку кода, сериализованные транзакции и все виды неприятных хаков для ограничить побочные эффекты). Конечно, я мог бы полностью лаять неправильное дерево - я озадачен тем, что не могу найти никаких других ссылок на это, учитывая повсеместность AdSense и характер проблемы (но опять же выводы AdSense JS Bug вопрос тоже удивителен). Мне бы очень хотелось, чтобы это оказалось глупой ошибкой с моей стороны, поэтому мне нужна проверка здравомыслия.

Я хотел бы спросить сообщество:

  • Кто-нибудь еще сталкивался с этой проблемой? Или кто-то, кто использует AdSense, может воспроизвести и подтвердить ее? [См. Примечание ниже]
  • Если проблема в том, что кажется, что я могу сделать? (кроме тянущих AdSense конечно)
  • Если нет, то что может быть причиной этого?

Для сумаризации: - Мои действия выполняются 2 (иногда 3) раза за запрос страницы.

  • ЭТО ТОЛЬКО СЛУЧАЕТСЯ, КОГДА ОБЪЯВЛЯЕТСЯ ОБЪЯВЛЕНИЯ В РЕКЛАМЕ GOOGLE
  • Я удалил все AdSense JS и ввел ошибку в свой собственный JS: действия вызываются только один раз ...
  • Аналогичная проблема может возникнуть, если на странице присутствуют пустые свойства src
  • Ответ на предыдущий вопрос свидетельствует о том, что AdSense JS устанавливает src="about:blank" на iFrame
  • Я пришел к выводу, что src="about:blank" из кода AdSense является наиболее вероятным источником проблемы.
  • Если я отключу JavaScript в браузере, проблема исчезнет

Просто, чтобы задокументировать то, что я исключил:

  • Это происходит во всех браузерах: Chrome (12), Firefox (5) и IE (8).
  • Я отключил все плагины в браузерах (YSlow, Firebug и т.д. ...)
  • В моем коде нет пустого источника (src="" / src="#") для изображений или других внешних ресурсов в коде
  • В css нет пустых ссылок (url(''))
  • Маловероятно, что это будет проблема с кодом / конфигурацией на стороне сервера, так как в Dev это не происходит (и из немногих различий между dev и production это отсутствие AdSence JS в Dev)

Примечание: Для любого, кто хочет повторить это, следует отметить, что, как ни странно, когда происходят множественные вызовы действий, Fiddler показывает только один запрос, отправляемый на сервер. Я понятия не имею, почему это так, но ведение журнала на сервере не лжет :) Возможно, кто-то, кто имел опыт работы с этой проблемой, когда она вызвана пустыми атрибутами src в тегах img, может сказать, видели ли они такое же поведение с Fiddler .


Запрашиваемая дополнительная информация

HTML (@Ivan)

Вот как я реализую Adsense (идентификаторы удалены)

<%@ 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)

Пока я сделал захват проволочной акулы:

  1. на клиенте при запросе страницы на production с проблемой
  2. на клиенте при запросе страницы на production без проблем (т.е. Adsense удален)

Я не вижу существенной разницы между этими двумя (хотя мои навыки работы с сетью невелики). Следует отметить, что они оба , похоже, имеют TCP retransmittion HTTP-запроса сразу после первоначального запроса - я не знаю, насколько это важно. Я могу подтвердить, однако, что в случае 1 сервер регистрирует сообщения о 2 выполнениях, а в случае 2 только одно выполнение.

Далее я попробую протоколирование TCP на стороне сервера в обоих случаях и опубликую результаты здесь.

Ответы [ 4 ]

4 голосов
/ 21 июля 2011

Mediabot - это имя, присвоенное сканеру, которое Google использует для сканирования веб-страниц в целях анализа контента, чтобы Google AdSense мог показывать контекстную рекламу на странице.

По моему опыту, это непредсказуемо и, да, оно может быть довольно тяжелым и раздражающим .

Если вы не хотите, чтобы бот Mediapartner обращался к определенной странице, вы можете запретить ее в вашем robots.txt с помощью:

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

Это будет иметь недостаток обслуживания нецелевых объявлений с этой конкретной страницы.

Если вы видите этот шаблон всегда на одной странице с другой строкой запроса, добавление канонического rel может облегчить боль.

Если вы не можете решить эту проблему и считаете это злоупотреблением, не стесняйтесь обращаться за помощью в службу поддержки Google по индексированию и ранжированию .

1 голос
/ 25 июля 2011

Учитывая, что поведение, которое вы наблюдаете, кажется сложным, чтобы избежать, можем ли мы сосредоточиться на обходных путях?

Можете ли вы дифференцировать запросы на основе UserAgent и таким образом отфильтровывать запросы. Может ли это быть жизнеспособным подходом для вас? Если это так, то вы, вероятно, могли бы опираться на этот подход: http://blog.flipbit.co.uk/2009/07/writing-iphone-sites-with-aspnet-mvc.html Здесь они обнаруживают айфоны, но у Mediapartners-Google бота такая же концепция.

0 голосов
/ 26 июля 2011

Да, я только что обнаружил это во время сеанса TeamView с моим партнером.На моем ящике моя главная страница ТОЛЬКО для моего сайта загружается один раз за запрос.

Тогда по совпадению при использовании Fiddler мой партнер получает 4 запроса на образец страницы.Это страница размером 1,5 МБ с большими сценариями и множеством других зависимостей, так что это действительно был момент WTF, поскольку я никогда не видел ничего подобного за 15 лет веб-разработки.Следует понимать, что сегодняшние сайты могут иметь очень большие страницы и очень большую аудиторию.Это может означать, что они увеличивают пропускную способность в 4 раза на запрос.Как я уже сказал, WTF ?????

Я бы хотел, чтобы у этого Q & A было более определенное разрешение.Я использую виджет Google Translate, но это происходит только на его коробке и на главной странице.Другие страницы также используют виджет перевода, и я запрашиваю JQUERY через Google CDN.Может ли что-нибудь Google сделать это.

0 голосов
/ 20 июля 2011

Помимо встраивания самого кода AdSense, есть две вещи, связанные с AdSense, которые отличаются в двух ваших тестовых случаях:

  1. Что еще происходит, когда !HttpContext.Current.IsDebuggingEnabled? Похоже, это фактический флаг production ; может быть, где-то происходит какой-то другой нюанс, который зависит от этого самого флага.

  2. Возможно ли, что Html.RenderPartial("AdSense_XXXXXX") каким-то образом заставляет ваш контроллер вернуться к началу выполнения?

Из вашего описания кажется, что на сервере выполняется дважды, но клиент отправляет только один запрос. Это подразумевает ошибку сервера, и эти две строки являются основной причиной вашего запуска AdSense. Чтобы еще больше сузить его, попробуйте встроить частичку AdSense напрямую, а не вызывать Html.RenderPartial(). Если это не изменит результат, возможно, стоит проверить, что еще включает HttpContext.Current.IsDebuggingEnabled.

В противном случае может быть полезно узнать, ведется ли регистрация на стороне сервера при получении запроса, до отправки ответа или после отправки ответа.

...