"undefined" случайным образом добавляется в 1% запрошенных URL-адресов на моем веб-сайте с 12 июня 2012 г.

Начиная с 12 июня 2012 11:20 TU, я вижу очень странные ошибки в моих журналах лаков /apache.

Иногда, когда пользователь запрашивал одну страницу, через несколько секунд я вижу аналогичный запрос, но вся строка после последнего/в URL-адресе заменена на "undefined".

Пример: http://example.com/foo/bar запускает http://example.com/foo/undefined.

Конечно, тезисы "undefined" страниц не существуют, и вместо этого возвращается моя страница 404 (это настраиваемая страница со стандартным макетом, а не классический apache 404)

  • Это происходит с любыми страницами (от главной страницы до самой глубокой).
  • с различными браузерами (в основном Chrome 19, но также firefox с 3.5 по 12, IE 8/9...), но только 1% трафика.
  • Заголовки, отправленные этим запросом, являются классическими заголовками (и нет заголовков ajax).
  • Для данного ip это кажется случайным: иногда на первой странице, посещаемой, иногда на случайной странице во время посещения, иногда несколько страниц во время посещения...

Конечно, это похоже на проблему с javascript (я использую jQuery 1.7.2, размещенную google), но я абсолютно ничего не изменил в js/html или конфигурации сервера, поскольку несколько дней, и я никогда раньше этого не видел. И, конечно, таких ссылок в html нет.

Я также заметил некоторые интересные факты:

  • запросы undefined никогда не будут найдены в качестве ссылки на другие страницы, но вместо этого "настоящие" страницы использовались в качестве референта для следующего запроса одного и того же IP-адреса (пользователь имеет возможность использовать классическое меню на 404 страница)
  • Я не видел никаких следов этих страниц в Google Analytics, поэтому я предполагаю, что javascript не был выполнен (трекер существует на всех страницах, включая 404)
  • Никто не связался с нами об этом, даже когда я вызвал проблему в социальных сетях веб-сайта.
  • большинство пользователей продолжают посещать после этого

Все эти факты заставляют меня думать, что проблема возникает в браузерах тихо, вероятно, вызвана багги-надстройкой, антивирусом, браузером или дрянным производителем, встроенным в браузеры, обновленные вчера (но я не нашел никакого добавления - выпущен вчера для chrome, firefox и IE).

Кто-нибудь здесь заметил ту же проблему или получил более полное объяснение?

Ответ 1

Нет простого прямого ответа.

Вам придется отлаживать это, и это, вероятно, JavaScript из-за слова "undefined" в URL-адресе. Однако он не должен быть AJAX, это может быть JavaScript, создающий любой URL-адрес, который автоматически разрешается браузером (например, JavaScript, который устанавливает атрибут src для тега изображения, устанавливает атрибут css-изображения и т.д.). Я использую Firefox с Firebug, установленным большую часть времени, поэтому мои указания будут иметь это значение.

Первоначальная настройка Firebug

Пропустите это, если вы уже знаете, как использовать Firebug.

После установки и перезапуска Firefox для Firebug вам нужно будет включить большинство панелей Firebug. Чтобы открыть Firebug, в верхнем правом углу браузера появится небольшая ошибка с огнем/насекомым, или вы можете нажать F12. Перейдите в вкладку "Консоль Firebug", "Script", "Сеть" и включите их, открыв их и прочитав информацию о панели. Возможно, вам придется обновить страницу, чтобы заставить их работать должным образом.

Отладка взаимодействия с пользователем

Перейдите на одну из страниц, у которой есть проблема с Firebug open и панель Net активна. На панели "Сеть" будет несколько вариантов: "Clear", "Persist", "All", "Html" и т.д. Убедитесь, что выбрано ALL. Не делайте ничего на странице и старайтесь не наводить на нее ничего. Просмотрите запросы. Запрос на неправильный URL-адрес будет красным и, вероятно, будет иметь статус 404 Not Found (или аналогичный).

Посмотрите на загрузку? Перейти к следующей части.

Не видите ли это при начальной загрузке? Начните использовать свою страницу и продолжайте здесь.

Начните нажимать на каждую функцию, нажимать на все и т.д. Следите за панелью Net и следите за запросами, которые не срабатывают. Возможно, вам придется быть творческим, но продолжайте использовать приложение, пока не увидите, что ваш браузер делает неверный запрос. Если на странице много запросов, не стесняйтесь нажать кнопку "Очистить" в верхнем левом углу панели "Сеть" , чтобы немного разобраться.

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

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

Вы можете использовать вкладку Script, чтобы настроить точки останова в своем JavaScript и пройти через них. Изучите обработчики событий через $(elemment).bind/click/focus/etc или из атрибутов старого школьного события, например onclick = "/onfocus =" " и т.д.

Если запрос выполняется, как только страница загружается

Это будет немного сложнее сделать. Вам нужно будет перейти на вкладку Script и начать добавлять точки останова для каждого Script, который запускается при загрузке. Вы делаете это, нажимая на левую часть строки JavaScript.

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

Что вы ищете в своем коде

Что-то похожее на следующее:

var url = workingUrl + someObject['someProperty'];

var url = workingUrl + someObject.someProperty;

Имейте в виду, что someObject может быть объектом {}, массивом [] или любым из типов внутреннего браузера. Дело в том, что доступ к ресурсу будет недоступен.

Я не вижу никаких 404/красных запросов

Тогда все, что вызывает его, не запускается вашими тестами. Попробуйте использовать больше вещей. Дело в том, что вы должны иметь возможность сделать запрос каким-то образом. Ты просто еще не знаешь. Он должен появиться на панели "Сеть" . Единственный раз, когда он не будет, это когда вы не выполняете никаких триггеров.

Заключение

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

Ответ 2

Основываясь на этом post, я обратил внимание на "Complitly" Chrome Plugin/malware и обнаружил, что это расширение вводит "улучшенный autocomplete", которая бросала запросы "undefined" на каждом сайте, у которого есть текстовое поле ввода с именем или идентификатором "поиск", "q" и многие другие.

Я также обнаружил, что файл enable.js(один из файлов с усложнением) проверял глобальную переменную под названием "suggestmeyes_loaded", чтобы увидеть, загружена ли она (например, Singleton). Таким образом, установка этой переменной в false отключает плагин.

Чтобы отключить вредоносное ПО и остановить запросы "undefined", примените это к каждой странице с полем поиска на вашем сайте:

<script type="text/javascript">
    window.suggestmeyes_loaded = true;
</script>

Это вредоносное ПО также перенаправляет ваших пользователей на сайт "searchcompletion.com", иногда демонстрируя конкурентов ADS. Поэтому его следует воспринимать всерьез.

Ответ 3

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

Если JavaScript используется для установки или изменения местоположений изображений, иногда бывает, что undefined входит в URI.

Когда это произойдет, браузер с радостью попытается загрузить изображение (нет заголовков AJAX), но он оставит подсказки: он устанавливает конкретный заголовок Accept:; вместо text/html, text/xml, ... он будет использовать image/jpeg, image/png, ....

Как только такой заголовок будет подтвержден, вы ограничили проблему только изображениями. Поиск основной причины может занять некоторое время:)

Обновление

Чтобы помочь отладке, вы можете переопределить $.fn.attr() и вызвать отладчик, когда что-то назначается undefined. Что-то вроде этого:

​(function($, undefined) {
    var $attr = $.fn.attr;

    $.fn.attr = function(attributeName, value) {
        var v = attributeName === 'src' ? value : attributeName.src;

        if (v === 'undefined') {
            alert("Setting src to undefined");
        }

        return $attr(attributeName, value);
    }
}(jQuery));

Ответ 4

Некоторые факты, которые были установлены, особенно в этой теме: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

это происходит на страницах, которые вообще не имеют javascript. это доказывает, что это не ошибка программирования на странице

пользователь не знает о проблеме и продолжает просматривать довольно счастливо.

это происходит через несколько секунд после того, как человек посещает страницу.

это не происходит со всеми.

происходит в нескольких браузерах (Chrome, IE, Firefox, Mobile Safari, Opera)

происходит на нескольких операционных системах (Linux, Android, NT)

происходит на нескольких веб-серверах (IIS, Nginx, Apache)

У меня есть один случай googlebot, следующий за ссылкой и требующий того же реферера. Они могут просто пытаться быть умными, и браузер передал его материнству, который затем отправил бота для расследования.

Я уверен, что предложение вызвано плагинами. Сложно одно, но это не поддерживает Opera. Там много других.

Хотя мобильные браузеры весят против теории плагинов.

Sysadmins сообщили о значительном снижении, добавив некоторый javascript на странице, чтобы обмануть Complitly, подумав, что он уже инициализирован.

Здесь мое решение для nginx:

location ~ undefined/?$  {
  return 204;
}

Это возвращает "да, хорошо, но никакого контента для вас".

Если вы находитесь на странице website.com/some/page, и вы (каким-то образом) перейдете на сайт website.com/some/page/ undefined, браузер отобразит URL-адрес как измененный, но даже не перезагрузит страницу. Предыдущая страница останется такой же, как и в окне.

Если по какой-то причине это то, что испытывают пользователи, тогда у них будет чистый опыт noop, и это не будет мешать тому, что они делают.

Ответ 5

Это звучит как условие гонки, когда переменная не получает правильную инициализацию перед тем, как использовать ее. Учитывая, что это не проблема AJAX, в соответствии с вашими комментариями, будет несколько способов понять это, перечисленные ниже.

Hookup Javascript exception Logger: это поможет вам уловить практически все случайные исключения javascript в вашем журнале. Большую часть времени здесь будут возникать ошибки в программировании. Поместите его перед любыми сценариями. Вам нужно будет поймать их на сервере и распечатать их в своих журналах для анализа позже. Это ваша первая линия обороны. Вот пример:

window.onerror = function(m,f,l) {
    var e = window.encodeURIComponent;
    new Image().src = "/jslog?msg=" + e(m) + "&filename=" + e(f) + "&line=" + e(l) + "&url=" + e(window.location.href);
};

Найти window.location. Для каждого из этих экземпляров вы должны добавить журнал или проверить на undefined concats/appenders на ваш window.location. Например:

function myCode(loc) {
    // window.location.href = loc; // old 
    typeof loc === 'undefined' && window.onerror(...); //new
    window.location.href = loc; //new
}

или слегка очиститель:

window.setLocation = function(url) { 
   /undefined/.test(url) ? 
         window.onerror(...) : window.location.href = url;       
}

function myCode(loc) {
    //window.location.href = loc; //old
    window.setLocation(loc); //new
} 

Если вы заинтересованы в получении stacktraces на этом этапе, посмотрите: https://github.com/eriwen/javascript-stacktrace

Захватить все необработанные ссылки undefined. Помимо window.location Остается только ссылки DOM. Третий шаг - проверить все необработанные ссылки DOM для вашего неправильного шаблона URL (вы можете подключить это сразу после завершения загрузки jQuery, раньше):

$("body").on("click", "a[href$='undefined']", function() {
    window.onerror('Bad link: ' + $(this).html()); //alert home base
});

Надеюсь, это полезно. Счастливая отладка.

Ответ 6

Мне интересно, может ли это быть проблемой рекламного блока. Когда я просматриваю журналы по IP-адресу, кажется, что каждый запрос конкретного пользователя в /folder/page.html сопровождается запросом в/folder/undefined

Ответ 7

Я не знаю, помогает ли это, но мой сайт заменяет один файл *.webp image с undefined после его загрузки в несколько браузеров. Ваш сайт размещает веб-изображения?

Ответ 8

У меня была аналогичная проблема (но с ошибками /null 404 в консоли), что ответ @andrew-martinez помог мне решить.

Оказывается, я использовал теги img с пустым полем src:

<img src="" alt="My image" data-src="/images/my-image.jpg">

Моя идея состояла в том, чтобы предотвратить загрузку изображения браузером при загрузке страницы, чтобы вручную загрузить позже, установив атрибут src из атрибута data-src с помощью javascript (ленивая загрузка). Но в сочетании с iDangerous Swiper этот метод вызвал ошибку.