“Undefined” випадково додається до 1% запитаних URL-адрес на моєму веб-сайті з 12 червня 2012 року


80

З 12 червня 2012 р. 11:20 TU, я бачу дуже дивні помилки в моїх журналах лаку / apache.

Іноді, коли користувач запитує одну сторінку, через кілька секунд я бачу подібний запит, але весь рядок після останньої / в URL-адресі замінено на "невизначений".

Приклад: http://example.com/foo/bar запускає http://example.com/foo/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 немає.

Також я помітив кілька цікавих фактів:

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

Усі ці факти змушують мене думати, що проблема виникає мовчки у веб-переглядачів, імовірно, спричинена помилковим доповненням, антивірусом, панеллю браузера або безглуздим програмним забезпеченням, інтегрованим у браузери, оновлені вчора (але я не знайшов жодної надбудови, випущеної вчора для chrome, firefox та IE).

Хтось тут помічав те саме питання чи має більш повне пояснення?


2
Деякий код JavaScript на ваших сторінках створює URL-адреси, і він має одну або кілька помилок. Програмне забезпечення, не змінюючи себе, може змінити поведінку через оновлення браузера, чутливість до дати / часу, зміни сценарію третьої частини тощо. Не бачачи коду, буде неможливо точно сказати, що не так.
Пойнті

3
Лише підказка / ідея щодо налагодження: - Розмістіть чітке повідомлення на своїй сторінці 404, де великими літерами вказуєте: "Якщо ви бачите це, чи не можете ви зв’язатися з x @ yz з описом того, як ви сюди потрапили" (можливо, лише якщо location.href.search("undefined")це правда). - Якщо електронних листів немає, і ви використовуєте jquery ajax скрізь, оберніть виклик jquery ajax у користувацьку функцію, яка спочатку перевіряє, чи повертаються дані JSON і чи існує data.undefinedError, і якщо вона існує, її десь зафіксуйте (+ створіть перевірку у вашому 404, який повертається, {undefinedError:true}якщо є undefinedв url).
Девід Малдер,

3
Я теж переживаю це, і не думаю, що це бот. І / cache / xxxx, і / / undefined Однак це не тільки Chrome 19, але і IE 8 та 9.

3
З 12 червня у мене також трапляються помилки {domain} / невизначені. Я намагався вилучити ВСЕ javascript зі свого сайту (аналітика Google, adsense тощо), але помилки все одно з’являються. З кожним днем ​​їх кількість збільшується. Майже всі помилки генеруються користувачами, які використовують Chrome різних версій. Я підозрюю, що це деякі розширення або надбудови, але я не можу відтворити їх на власному ПК. Я також згадав, що запит, що містить / невизначений, завжди виконується після правильного запиту сторінки з усіма підзапитами (зображення, css тощо)
Алмас

3
В іншій доповіді, також , що вона почалася 12 червня: productforums.google.com/forum/#!topic/chrome/G1snYHaHSOc
Dogweather

Відповіді:


21

Немає простої прямої відповіді.

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

Початкове налаштування Firebug

Пропустіть це, якщо ви вже знаєте, як користуватися Firebug.

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

Налагодження взаємодії користувачів

Перейдіть на одну зі сторінок, у яких проблема з відкритим Firebug і активною панеллю Мережа. На панелі Мережа буде декілька опцій: "Очистити", "Зберегти", "Усі", "HTML" тощо. Переконайтеся, що вибрано ВСЕ. Не робіть нічого на сторінці і намагайтеся не наводити мишею нічого на ній. Перегляньте запити. Запит на недійсну URL-адресу буде червоним і, можливо, матиме статус 404 Не знайдено (або подібний).

Побачиш під навантаженням? Перехід до наступної частини.

Не бачите його при початковому навантаженні? Почніть використовувати свою сторінку і продовжуйте тут.

Почніть натискати на кожну функцію, наводити курсор на все і т. Д. Не зважайте на панель Мережі та стежте за помилками запитів. Можливо, вам доведеться проявити креативність, але продовжуйте використовувати свою програму, поки ваш браузер не зробить недійсний запит. Якщо сторінка робить багато запитів, сміливо натискайте кнопку «Очистити» у верхньому лівому куті панелі Мережа, щоб трохи її очистити.

Якщо ви подаєте сторінку і бачите, що невдалий запит виходить дуже швидко, але потім втрачає його, оскільки завантажується наступна сторінка, увімкніть постійність, натиснувши "Зберегти" у верхньому лівому куті панелі Мережа.

Як тільки це станеться, і це повинно бути, розгляньте, що ви зробили, щоб це сталося. Подивіться, чи зможете ви повторити це. З’ясувавши, яка взаємодія з користувачем це робить, зануртесь у цей код і починайте шукати речі, які роблять недійсні запити.

Ви можете використовувати вкладку Сценарій, щоб встановити точки зупинку у своєму JavaScript і пройти їх. Дослідіть обробники подій, виконані за допомогою $ (elemment) .bind / click / focus / etc або зі старих атрибутів подій, таких як onclick = "" / onfocus = "" тощо.

Якщо запит відбувається відразу після завантаження сторінки

Це буде трохи важче прив’язати. Вам потрібно буде перейти на вкладку "Сценарій" і почати додавати точки розриву до кожного сценарію, який працює під час завантаження. Ви робите це, натискаючи ліву частину рядка JavaScript.

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

Те, що ви шукаєте у своєму коді

Щось подібне до такого:

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

var url = workingUrl + someObject.someProperty;

Майте на увазі, що someObject може бути об’єктом {}, масивом []або будь-яким із внутрішніх типів браузера. Справа в тому, що буде доступ до властивості, яка не існує.

Я не бачу жодних 404 / червоних запитів

Тоді те, що спричиняє, не ініціюється вашими тестами. Спробуйте використовувати більше речей. Справа в тому, що ви повинні якось здійснити запит. Ти просто ще не знаєш. Він повинен відображатися на панелі Мережа. Єдиного разу це не станеться, коли ви не робите те, що викликає це.

Висновок

Не існує надзвичайно простого способу визначити, що саме відбувається. Однак використовуючи описані мною методи, ви повинні мати принаймні змогу наблизитися. Це, мабуть, щось, про що ви навіть не розглядаєте.


1
Дякую за Вашу відповідь. Я вже намагався перевірити це за допомогою firebug і, переглядаючи мої журнали лаку / apache на моєму ip, без успіху. Тези "невизначених" запитів становлять менше 1% усіх html-запитів, і це стосується всіх типів сторінок, тому їх дуже важко викликати. Але наступного тижня я спробую ще раз, використовуючи різні браузери, і буду детальніше досліджувати обробники подій, як ви сказали. Дякую!
colinux

Б'юся об заклад, що швидше за все це щось на зразок var url = omeObject['usuallyAURL'];, і це встановлюється як src або href якогось запитуваного ресурсу, і, таким чином, трактується як відносний запит шляху. тобто<img src="undefined" />
Ягель

17

На основі цього допису я здійснив зворотну розробку плагіна / зловмисного програмного забезпечення "Комплітно" Chrome і виявив, що це розширення вводить функцію "вдосконаленого автозавершення", яка кидає "невизначені" запити на кожен веб-сайт, що має текстове поле вводу з ім'ям або Ідентифікатор "пошуку", "q" та багатьох інших.

Я також виявив, що файл enable.js (один із цілком файлів) перевіряв глобальну змінну під назвою "предложитиме_завантажений", щоб перевірити, чи він вже завантажений (як Singleton). Отже, встановлення для цієї змінної значення false відключає плагін.

Щоб вимкнути шкідливе програмне забезпечення та зупинити "невизначені" запити, застосуйте це до кожної сторінки з полем пошуку на вашому сайті:

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

Це шкідливе програмне забезпечення також перенаправляє ваших користувачів на сайт "searchcompletion.com", іноді показуючи конкурентів ADS. Отже, це слід сприймати серйозно.


Я бачу це і в своїх журналах, на сторінках, де це не може бути JS; Я вважаю, що ви на 100% правильні. Хоча мені цікаво, як довго пройде, перш ніж зловмисне програмне забезпечення змінить назву цієї змінної.
Лоуренс Дол

звучить цілком правдоподібно в моєму випадку. один виняток: Запитувана URL-адреса: / ForSale / beach_front_property / bronx / undefined / Агент користувача: Mozilla / 5.0 (сумісний; Googlebot / 2.1; + google.com/bot.html ), не впевнений, чому Googlebot може знайти і слідувати за цим. якщо вони десь не виявили URL-адресу і не пішли подивитися подивитися. але бот вказує правильну адресу
реферала

ще один виняток: Агент користувача: Opera / 9.80 (Windows NT 5.1) Presto / 2.12.388 Версія / 12.16 Повністю недоступний для Opera, також я бачу багато Linux, Android та NT
Кріс Саттінгер,

@felix Одне місце, яке Googlebot дізнається про URL-адреси, - це від користувачів Chrome, коли браузер "телефонує додому"
Izkata

8

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

Якщо JavaScript використовується для встановлення або зміни розташування зображень, іноді трапляється, що an undefinedпроникає до URI.

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

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

Оновлення

Для полегшення налагодження ви можете замінити $.fn.attr()та викликати налагоджувач, коли щось присвоюється невизначеному. Щось на зразок цього:

​(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));

Ви маєте рацію, я міг би отримати перевагу завдяки заголовкам. Коли це запит Chrome, заголовки є (вибачте за погане форматування в коментарях). Host: statistiks.fr User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5 Accept: */* Referer: http://statistiks.fr/basket-ball/[..] Accept-Encoding: gzip,deflate,sdch [...] Але з IE9, прийняти реферери заголовків до зображення: Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 Наступного тижня я знайду час, щоб дослідити на стороні зображень. Дякую!
colinux

@colinux Я оновив свою відповідь, щоб допомогти вам легше знайти проблему. Повідомте мене, якщо у вас виникнуть проблеми із застосуванням цього.
Jack

3

Деякі факти, які були встановлені, особливо в цій темі: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

це трапляється на сторінках, які взагалі не мають JavaScript. це доводить, що це не помилка програмування на сторінці

користувач не знає про проблему і продовжує переглядати цілком щасливо.

це відбувається через кілька секунд після того, як людина відвідає сторінку.

це трапляється не з усіма.

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

відбувається в декількох операційних системах (Linux, Android, NT)

відбувається на декількох веб-серверах (IIS, Nginx, Apache)

У мене є один випадок, коли Googlebot переходить за посиланням і вимагає того самого реферала. Можливо, вони просто намагаються бути розумними, і браузер повідомив це материнському кораблю, який потім запропонував боту для розслідування.

Я досить впевнений в пропозиції, що це спричинено плагінами. Complitly є одним, але це не підтримує Opera. Є багато інших.

Хоча мобільні браузери важать проти теорії плагінів.

Сисадміни повідомили про значне падіння, додавши на сторінку трохи javascript, щоб змусити Complitly подумати, що він уже ініціалізований.

Ось моє рішення для nginx:

location ~ undefined/?$  {
  return 204;
}

Це повертає "так, добре, але ніякого вмісту для вас".

Якщо ви знаходитесь на веб-сайті.com/some/page і (якимось чином) переходите на website.com/some/page/undefined, браузер відображатиме URL-адресу як змінену, але навіть не перезавантажує сторінку. Попередня сторінка залишиться такою, якою вона була у вікні.

Якщо з якихось причин це щось досвідчене користувачами, тоді вони матимуть чистий досвід роботи, і це не буде заважати тому, що вони робили.


Ваше рішення, безумовно, врятувало мене від наслідків цього. Браузер скаржився на змішаний вміст (ssl та plain), тепер це вирішено, дякую.
Моріц

2

Це звучить як умова перегони, коли змінна неправильно ініціалізується перед використанням. Враховуючи, що це не проблема AJAX, згідно з вашими коментарями, існує кілька способів з’ясувати це, перераховані нижче.

Підключити реєстратор винятків Javascript : це допоможе вам вловити майже всі випадкові винятки 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 : для кожного з цих випадків вам слід додати журналювання або перевірити наявність невизначених кокатів / додатків до вашого 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
} 

Якщо ви зацікавлені отримати стек-траси на цьому етапі, подивіться: https://github.com/eriwen/javascript-stacktrace

Візьміть усі необроблені невизначені посилання : Крім window.location Єдине, що залишилось - це самі DOM-посилання. Третім кроком є ​​перевірка всіх невідпрацьованих посилань на DOM на наявність недійсного шаблону URL-адреси (ви можете додати це відразу після завершення завантаження jQuery, краще раніше):

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

Сподіваюся, це корисно. Щасливої ​​налагодження.


1

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


Я думаю, це також пов'язано з програмним забезпеченням на клієнті. Виходячи з останніх журналів, це відбувається лише для певних IP-адрес, і, здається, це відбувається послідовно і для тих. Я бачу BTRS123368 та AskTbORJ / 5.15.2.23037 у рядку агента користувача, можливо, це пов’язано з одним із них.
Jorrit Schippers

Я отримав ще кілька результатів: хтось із FunWebProducts в користувацькому агенті також запитує / невизначені URL-адреси.
Jorrit Schippers

0

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


0

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

Виявляється, я використовував imgтеги з порожнім srcполем:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.