"Undefiniert" wird seit dem 12. Juni 2012 in 1% der angeforderten URLs auf meiner Website zufällig angehängt

80

Seit dem 12. Juni 2012 um 11:20 Uhr TU sehe ich sehr seltsame Fehler in meinen Lack- / Apache-Protokollen.

Manchmal, wenn ein Benutzer eine Seite angefordert hat, sehe ich einige Sekunden später eine ähnliche Anforderung, aber die Zeichenfolge all nach dem letzten / in der URL wurde durch "undefined" ersetzt.

Beispiel: http://example.com/foo/bar löst eine http://example.com/foo/undefined Anfrage aus.

Natürlich existieren diese "undefinierten" Seiten nicht und meine 404-Seite wird stattdessen zurückgegeben (dies ist eine benutzerdefinierte Seite mit einem Standardlayout, kein klassischer Apache 404).

  • Dies geschieht bei allen Seiten (von der Homepage bis zur tiefsten)
  • mit verschiedenen Browsern (meistens Chrome 19, aber auch Firefox 3.5 bis 12, IE 8/9 ...) aber nur 1% des Verkehrs.
  • Die von dieser Anfrage gesendeten Header sind klassische Header (und es gibt keine Ajax-Header).
  • Für eine bestimmte IP scheint dies zufällig zu geschehen: manchmal auf der ersten besuchten Seite, manchmal auf einer zufälligen Seite während des Besuchs, manchmal auf mehreren Seiten während des Besuchs ...

Natürlich sieht es nach einem Javascript-Problem aus (ich verwende jquery 1.7.2, das von Google gehostet wird), aber ich habe seit einigen Tagen absolut nichts an js / html oder der Serverkonfiguration geändert und diese Art von Fehler noch nie gesehen . Und natürlich gibt es keine solchen Links im HTML.

Ich habe auch einige interessante Fakten bemerkt:

  • Die undefinierten Anforderungen werden nie als Verweis auf andere Seiten gefunden, sondern die "echten" Seiten wurden als Verweis für die folgende Anforderung derselben IP verwendet (der Benutzer kann das klassische Menü auf der 404-Seite verwenden).
  • Ich habe in Google Analytics keine Spur dieser Seiten gesehen, daher gehe ich davon aus, dass kein Javascript ausgeführt wurde (Tracker ist auf allen Seiten vorhanden, einschließlich 404).
  • Niemand hat uns diesbezüglich kontaktiert, auch wenn ich das Problem in den sozialen Netzwerken der Website angesprochen habe
  • Die meisten Benutzer setzen den Besuch danach fort

All diese Fakten lassen mich denken, dass das Problem in den Browers stillschweigend auftritt, wahrscheinlich ausgelöst durch ein fehlerhaftes Add-On, Antivirus, eine Browserleiste oder einen beschissenen Hersteller, der in die gestern aktualisierten Browser integriert ist (aber ich habe kein veröffentlichtes Add-On gefunden gestern für Chrome, Firefox und IE).

Hat hier jemand das gleiche Problem bemerkt oder eine ausführlichere Erklärung?

colinux
quelle
2
Einige JavaScript-Codes auf Ihren Seiten erstellen URLs und weisen einen oder mehrere Fehler auf. Software kann, ohne selbst geändert zu werden, das Verhalten aufgrund von Browser-Updates, Empfindlichkeit gegenüber Datum / Uhrzeit, Skriptänderungen im 3. Teil usw. ändern. Ohne den Code zu sehen, ist es unmöglich, genau zu sagen, was falsch ist.
Pointy
3
Nur ein Tipp / eine Idee zum Debuggen: - Platzieren Sie auf Ihrer 404-Seite eine klare Nachricht mit den ziemlich großen Buchstaben "Wenn Sie dies sehen, können Sie sich bitte an x ​​@ yz wenden, um zu beschreiben, wie Sie hierher gekommen sind" (möglicherweise nur angezeigt, wenn dies der location.href.search("undefined")Fall ist). - Wenn keine E-Mails vorhanden sind und Sie überall jquery ajax verwenden, schließen Sie den Aufruf von jquery ajax in eine benutzerdefinierte Funktion ein, die zunächst prüft, ob die zurückgegebenen Daten ein JSON sind und ob data.undefinedError vorhanden ist, und ob sie irgendwo protokolliert werden (+ erstellen Sie eine Prüfung in Ihrem 404, die zurückgibt, {undefinedError:true}wenn es undefinedin der URL ist).
David Mulder
3
Ich erlebe das auch und denke auch nicht, dass es ein Bot ist. Sowohl das / cache / xxxx als auch das / undefined Es ist jedoch nicht nur Chrome 19, sondern auch IE 8 und 9.
3
Seit dem 12. Juni treten auch {domain} / undefined-Fehler auf. Ich habe versucht, ALLES Javascript von meiner Website zu entfernen (Google Analytics, Adsense usw.), aber es werden immer noch Fehler angezeigt. Mit jedem Tag nimmt die Anzahl von ihnen zu. Fast alle Fehler werden von Benutzern generiert, die Chrome verschiedener Versionen verwenden. Ich vermute, dass es sich um einige Erweiterungen oder Add-Ins handelt, kann diese aber nicht auf meinem eigenen PC reproduzieren. Ich erwähnte auch, dass eine Anfrage, die / undefined enthält, immer nach der korrekten Seitenanforderung mit der gesamten Unteranforderung (Bilder, CSS usw.)
Almas
3
Ein weiterer Bericht, der ebenfalls am 12. Juni begann: productforums.google.com/forum/#!topic/chrome/G1snYHaHSOc
Dogweather

Antworten:

21

Es gibt keine einfache klare Antwort.

Sie müssen dies debuggen und es ist wahrscheinlich JavaScript aufgrund des 'undefinierten' Wortes in der URL. Es muss jedoch nicht AJAX sein, sondern es kann JavaScript sein, das eine URL erstellt, die vom Browser automatisch aufgelöst wird (z. B. JavaScript, das das src-Attribut für ein Image-Tag festlegt, ein CSS-Image-Attribut usw.). Ich verwende Firefox die meiste Zeit mit installiertem Firebug , daher werden meine Anweisungen diesbezüglich berücksichtigt.

Firebug-Ersteinrichtung

Überspringen Sie dies, wenn Sie bereits wissen, wie man Firebug verwendet.

Nach der Installation und dem Neustart von Firefox for Firebug müssen Sie die meisten "Panels" von Firebug aktivieren. Um Firebug zu öffnen, befindet sich in der oberen rechten Ecke Ihres Browsers ein kleines Feuerwanzen- / Insekten-Ding, oder Sie können F12 drücken. Klicken Sie sich durch die Firebug-Registerkarten "Konsole", "Skript", "Netz" und aktivieren Sie sie, indem Sie sie öffnen und die Informationen des Panels lesen. Möglicherweise müssen Sie die Seite aktualisieren, damit sie ordnungsgemäß funktioniert.

Debuggen der Benutzerinteraktion

Navigieren Sie zu einer der Seiten, auf denen Firebug geöffnet und das Net-Bedienfeld aktiv ist. Im Netzfenster stehen einige Optionen zur Verfügung: "Löschen", "Behalten", "Alle", "HTML" usw. Stellen Sie sicher, dass ALLE ausgewählt ist. Tun Sie nichts auf der Seite und versuchen Sie, nichts darüber zu bewegen. Schauen Sie sich die Anfragen an. Die Anforderung für die ungültige URL ist rot und hat wahrscheinlich den Status 404 Nicht gefunden (oder ähnlich).

Sehen Sie es unter Last? Fahren Sie mit dem nächsten Teil fort.

Sehen Sie es beim ersten Laden nicht? Beginnen Sie mit der Verwendung Ihrer Seite und fahren Sie hier fort.

Klicken Sie auf jede Funktion, fahren Sie mit der Maus über alles usw. Behalten Sie das Netzfenster im Auge und suchen Sie nach fehlgeschlagenen Anforderungen. Möglicherweise müssen Sie kreativ sein, aber verwenden Sie Ihre Anwendung so lange, bis Ihr Browser eine ungültige Anfrage stellt. Wenn die Seite viele Anfragen stellt, können Sie auf die Schaltfläche "Löschen" oben links im Netzfenster klicken, um sie ein wenig zu löschen.

Wenn Sie die Seite senden und feststellen, dass eine fehlgeschlagene Anforderung sehr schnell ausgeht, aber dann verloren geht, weil die nächste Seite geladen wird, aktivieren Sie die Persistenz, indem Sie oben links im Netzfenster auf "Persistent" klicken.

Sobald dies der Fall ist und sollte, sollten Sie überlegen, was Sie getan haben, um dies zu erreichen. Sehen Sie, ob Sie es wieder schaffen können. Nachdem Sie herausgefunden haben, welche Benutzerinteraktion dies bewirkt, tauchen Sie in diesen Code ein und suchen Sie nach Dingen, die ungültige Anforderungen stellen.

Auf der Registerkarte "Skript" können Sie Haltepunkte in Ihrem JavaScript einrichten und diese schrittweise durchlaufen. Untersuchen Sie Ereignishandler, die über $ (elemment) .bind / click / focus / etc oder anhand von Ereignisattributen der alten Schule wie onclick = "" / onfocus = "" usw. erstellt wurden.

Wenn die Anforderung erfolgt, sobald die Seite geladen wird

Es wird etwas schwieriger sein, dies festzuhalten. Sie müssen zur Registerkarte "Skript" wechseln und jedem Skript, das beim Laden ausgeführt wird, Haltepunkte hinzufügen. Klicken Sie dazu auf die linke Seite der JavaScript-Zeile.

Laden Sie Ihre Seite neu und Ihre Haltepunkte sollten den Browser daran hindern, die Seite zu laden. Klicken Sie im Skriptfenster auf die Schaltfläche "Weiter". Gehen Sie zu Ihrem Netzpanel und prüfen Sie, ob Ihre Anfrage gestellt wurde. Fahren Sie fort, bis sie gefunden wurde. Sie können dies verwenden, um einzugrenzen, woher die Anforderung stammt, indem Sie langsam mehr und mehr Haltepunkte hinzufügen und dann in Funktionen ein- und aussteigen.

Was Sie in Ihrem Code suchen

Etwas, das dem folgenden ähnlich ist:

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

var url = workingUrl + someObject.someProperty;

Beachten Sie, dass someObject ein Objekt {}, ein Array []oder einer der internen Browsertypen sein kann. Der Punkt ist, dass auf eine Eigenschaft zugegriffen wird, die nicht existiert.

Ich sehe keine 404 / roten Anfragen

Was auch immer es verursacht, es wird nicht durch Ihre Tests ausgelöst. Versuchen Sie, mehr Dinge zu verwenden. Der Punkt ist, dass Sie in der Lage sein sollten, die Anfrage irgendwie zu erfüllen. Du weißt es einfach noch nicht. Es muss im Net-Bereich angezeigt werden. Das einzige Mal, wenn dies nicht der Fall ist, wenn Sie nicht das tun, was es auslöst.

Fazit

Es gibt keine super einfache Möglichkeit, genau zu bestimmen, was gerade passiert. Mit den von mir beschriebenen Methoden sollten Sie jedoch zumindest in der Lage sein, näher zu kommen. Es ist wahrscheinlich etwas, über das Sie nicht einmal nachdenken.

Andrew Martinez
quelle
1
Vielen Dank für Ihre Antwort. Ich habe bereits versucht, dies mit Firebug und durch Beobachten meiner Lack- / Apache-Protokolle auf meiner IP zu überprüfen, ohne Erfolg. Diese "undefinierten" Anforderungen machen weniger als 1% aller HTML-Anforderungen aus, und alle Arten von Seiten sind betroffen, daher ist es sehr schwierig, sie auszulösen. Aber nächste Woche werde ich es erneut mit verschiedenen Browsern versuchen und die Event-Handler, wie Sie sagten, genauer untersuchen. Vielen Dank!
Colinux
Ich wette, dass es wahrscheinlicher ist, dass es nur so etwas ist var url = omeObject['usuallyAURL'];, und dass dies als src oder href eines angeforderten Assets festgelegt wird und daher als relative Pfadanforderung behandelt wird. dh<img src="undefined" />
Yahel
17

Basierend auf diesem Beitrag habe ich das Chrome-Plugin / die Malware "Complitly" rückentwickelt und festgestellt, dass diese Erweiterung eine "verbesserte Autocomplete" -Funktion einfügt, die an jeder Site mit einem Eingabetextfeld mit NAME oder "undefinierte" Anforderungen auslöst ID von "Suche", "q" und vielen anderen.

Ich fand auch heraus, dass die Datei enable.js (eine der vollständig kompatiblen Dateien) eine globale Variable namens "suggestmeyes_loaded" überprüfte, um festzustellen, ob sie bereits geladen ist (wie ein Singleton). Wenn Sie diese Variable auf false setzen, wird das Plugin deaktiviert.

Wenden Sie dies auf jede Seite mit einem Suchfeld auf Ihrer Website an, um die Malware zu deaktivieren und "undefinierte" Anforderungen zu stoppen:

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

Diese Malware leitet Ihre Benutzer auch auf eine Website "searchcompletion.com" weiter, auf der manchmal ADS von Mitbewerbern angezeigt wird. Es sollte also ernst genommen werden.

Willy Barro
quelle
Ich sehe dies auch in meinen Protokollen, mit Seiten, auf denen es unmöglich JS sein kann; Ich glaube du bist 100% richtig. Obwohl ich mich frage, wie lange es dauern wird, bis die Malware den Namen dieser Variablen ändert.
Lawrence Dol
klingt in meinem Fall durchaus plausibel. Eine Ausnahme: Angeforderte URL: / ForSale / beach_front_property / bronx / undefined / Benutzeragent: Mozilla / 5.0 (kompatibel; Googlebot / 2.1; + google.com/bot.html ) nicht sicher, warum der Googlebot das finden und befolgen würde. es sei denn, sie haben die URL irgendwo entdeckt und sind gegangen, um nachzuschauen. aber der Bot gibt eine korrekte Referrer-URL an
Chris Sattinger
Eine weitere Ausnahme: Benutzeragent: Opera / 9.80 (Windows NT 5.1) Presto / 2.12.388 Version / 12.16 Ist für Opera nicht vollständig verfügbar. Ich sehe auch viel Linux, Android und NT
Chris Sattinger
@felix Ein Ort, an dem Googlebot etwas über URLs erfährt, ist von Chrome-Nutzern, wenn der Browser "nach Hause telefoniert"
Izkata
8

Sie haben korrekt festgestellt, dass es undefinedsich um ein JavaScript-Problem handelt. Wenn sich Ihre Site-Benutzer nicht über das Anzeigen von Fehlerseiten beschwert haben, können Sie Folgendes überprüfen.

Wenn JavaScript zum Festlegen oder Ändern von Bildpositionen verwendet wird, kommt es manchmal vor, dass ein undefinedin den URI gelangt.

In diesem Fall versucht der Browser gerne, das Bild zu laden (keine AJAX-Header), hinterlässt jedoch Hinweise: Er legt einen bestimmten Accept:Header fest. stattdessen text/html, text/xml, ...wird verwendet image/jpeg, image/png, ....

Sobald ein solcher Header bestätigt wurde, haben Sie das Problem auf Bilder beschränkt. Das Finden der Grundursache wird jedoch möglicherweise einige Zeit dauern :)

Aktualisieren

Um das Debuggen zu erleichtern, können Sie $.fn.attr()den Debugger überschreiben und aufrufen, wenn etwas undefiniert zugewiesen wird. Etwas wie das:

​(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));
Jack
quelle
Sie haben Recht, ich könnte dank der Überschriften einen Vorsprung haben. Wenn es sich um eine Chrome-Anfrage handelt, sind die Header (Entschuldigung für die schlechte Formatierung in den Kommentaren). 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 [...] Bei IE9 verweist der Accept-Header jedoch auf ein Bild: Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 Nächste Woche werde ich mir Zeit nehmen, um die Bildseite zu untersuchen. Vielen Dank!
Colinux
@colinux Ich habe meine Antwort aktualisiert, damit Sie das Problem leichter finden können. Lassen Sie mich wissen, wenn Sie Probleme bei der Anwendung haben.
Ja͢ck
3

Einige Fakten, die insbesondere in diesem Thread ermittelt wurden: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

Dies geschieht auf Seiten, die überhaupt kein Javascript enthalten. Dies beweist, dass es sich nicht um einen On-Page-Programmierfehler handelt

Der Benutzer ist sich des Problems nicht bewusst und surft weiterhin recht glücklich.

Dies geschieht einige Sekunden, nachdem die Person die Seite besucht hat.

es passiert nicht jedem.

geschieht in mehreren Browsern (Chrome, IE, Firefox, Mobile Safari, Opera)

passiert auf mehreren Betriebssystemen (Linux, Android, NT)

geschieht auf mehreren Webservern (IIS, Nginx, Apache)

Ich habe einen Fall von Googlebot, der dem Link folgt und denselben Verweis beansprucht. Möglicherweise versuchen sie nur, klug zu sein, und der Browser hat dies dem Mutterschiff mitgeteilt, das dann einen Bot zur Untersuchung aufstellte.

Ich bin ziemlich überzeugt von dem Vorschlag, dass er durch Plugins verursacht wird. Komplett ist eine, aber das unterstützt Opera nicht. Es gibt viele andere.

Obwohl die mobilen Browser gegen die Plugin-Theorie abwägen.

Sysadmins haben einen großen Rückgang gemeldet, indem sie etwas Javascript auf der Seite hinzugefügt haben, um zu täuschen, dass es bereits initialisiert ist.

Hier ist meine Lösung für Nginx:

location ~ undefined/?$  {
  return 204;
}

Dies gibt "Ja, okay, aber kein Inhalt für Sie" zurück.

Wenn Sie sich auf website.com/some/page befinden und (irgendwie) zu website.com/some/page/undefined navigieren, zeigt der Browser die geänderte URL an, führt jedoch nicht einmal ein erneutes Laden der Seite durch. Die vorherige Seite bleibt wie im Fenster.

Wenn dies aus irgendeinem Grund von Benutzern erlebt wird, haben sie ein sauberes Noop-Erlebnis und es stört nicht, was sie getan haben.

Chris Sattinger
quelle
Ihre Lösung hat mich definitiv vor den Folgen bewahrt. Der Browser hat sich über gemischte Inhalte (ssl und plain) beschwert, jetzt ist dies gelöst, danke.
Moritz
2

Dies klingt nach einer Race-Bedingung, bei der eine Variable vor der Verwendung nicht ordnungsgemäß initialisiert wird. Da dies laut Ihren Kommentaren kein AJAX-Problem ist, gibt es verschiedene Möglichkeiten, dies herauszufinden (siehe unten).

Anschließen eines Javascript-Ausnahme-Loggers : Auf diese Weise können Sie nahezu alle zufälligen Javascript-Ausnahmen in Ihrem Protokoll abfangen. Meistens treten hier programmatische Fehler auf. Stellen Sie es vor alle Skripte. Sie müssen diese auf dem Server abfangen und zur späteren Analyse in Ihre Protokolle drucken. Dies ist Ihre erste Verteidigungslinie. Hier ist ein Beispiel:

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);
};

Suche nach window.location : Für jede dieser Instanzen sollten Sie die Protokollierung hinzufügen oder nach undefinierten Konkaten / Appendern zu Ihrer window.location suchen. Zum Beispiel:

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

oder das etwas sauberere:

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
} 

Wenn Sie zu diesem Zeitpunkt an Stacktraces interessiert sind, besuchen Sie: https://github.com/eriwen/javascript-stacktrace

Holen Sie sich alle nicht behandelten undefinierten Links : Neben window.location Das einzige, was noch übrig ist, sind die DOM-Links selbst. Der dritte Schritt besteht darin, alle nicht gehandelten DOM-Links auf Ihr ungültiges URL-Muster zu überprüfen (Sie können dieses direkt nach Abschluss des Ladevorgangs von jQuery anhängen, früher besser):

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

Hoffe das ist hilfreich. Viel Spaß beim Debuggen.

Kunst
quelle
1

Ich frage mich, ob dies ein Adblocker-Problem sein könnte. Wenn ich die Protokolle nach IP-Adresse durchsuche, scheint es, dass auf jede Anfrage eines bestimmten Benutzers an /folder/page.html eine Anfrage an / folder / undefined folgt

Sean
quelle
Ich denke, das hängt auch mit der Software auf dem Client zusammen. Basierend auf den letzten Protokollen geschieht dies nur für bestimmte IP-Adressen, und dies scheint auch für diese konsistent zu sein. Ich sehe BTRS123368 und AskTbORJ / 5.15.2.23037 in der Benutzeragentenzeichenfolge, möglicherweise hängt es mit einer davon zusammen.
Jorrit Schippers
Ich habe weitere Ergebnisse erhalten: Jemand mit FunWebProducts im Benutzeragenten fordert auch / undefinierte URLs an.
Jorrit Schippers
0

Ich weiß nicht, ob dies hilft, aber meine Website ersetzt eine bestimmte * .webp-Bilddatei durch eine undefinierte, nachdem sie in mehreren Browsern geladen wurde. Hostet Ihre Website Webp-Bilder?

Joseph Coco
quelle
0

Ich hatte ein ähnliches Problem (aber mit /null404 Fehlern in der Konsole), dessen Lösung mir bei der Antwort von @ andrew-martinez geholfen hat.

Es stellt sich heraus, dass ich imgTags mit einem leeren srcFeld verwendet habe:

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

Meine Idee war es, zu verhindern, dass der Browser das Bild beim Laden der Seite lädt, um es später manuell zu laden, indem das src-Attribut aus dem data-src-Attribut mit Javascript festgelegt wird (verzögertes Laden). In Kombination mit iDangerous Swiper verursachte diese Methode den Fehler.

Iwazaru
quelle