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?
quelle
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 esundefined
in der URL ist).Antworten:
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.
quelle
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" />
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.
quelle
Sie haben korrekt festgestellt, dass es
undefined
sich um ein JavaScript-Problem handelt. Wenn sich Ihre Site-Benutzer nicht über das Anzeigen von Fehlerseiten beschwert haben, können Sie Folgendes überprüfen.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. stattdessentext/html, text/xml, ...
wird verwendetimage/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));
quelle
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!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.
quelle
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.
quelle
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
quelle
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?
quelle
Ich hatte ein ähnliches Problem (aber mit
/null
404 Fehlern in der Konsole), dessen Lösung mir bei der Antwort von @ andrew-martinez geholfen hat.Es stellt sich heraus, dass ich
img
Tags mit einem leerensrc
Feld 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.
quelle