Od 12 czerwca 2012 11:20 TU widzę bardzo dziwne błędy w moich logach lakieru / apache'a.
Czasami, gdy użytkownik zażąda jednej strony, kilka sekund później widzę podobne żądanie, ale cały ciąg po ostatnim / w adresie URL został zastąpiony przez „niezdefiniowany”.
Przykład: http://example.com/foo/bar wyzwala http://example.com/foo/undefined żądanie.
Oczywiście te „niezdefiniowane” strony nie istnieją i zamiast tego zwracana jest moja strona 404 (która jest niestandardową stroną o standardowym układzie, a nie klasycznym Apache 404)
- Dzieje się tak w przypadku wszystkich stron (od strony głównej do najgłębszej)
- z różnymi przeglądarkami (głównie Chrome 19, ale także Firefox 3.5 do 12, IE 8/9 ...), ale tylko 1% ruchu.
- Nagłówki wysyłane przez to żądanie to klasyczne nagłówki (i nie ma nagłówków Ajax).
- W przypadku danego adresu IP wydaje się, że dzieje się to losowo: czasami na pierwszej odwiedzanej stronie, czasami na przypadkowej stronie podczas wizyty, czasami na kilku stronach podczas wizyty ...
Oczywiście wygląda to na problem z javascriptem (używam jquery 1.7.2 hostowanego przez google), ale absolutnie nic się nie zmieniło w js / html ani w konfiguracji serwera od kilku dni i nigdy wcześniej nie widziałem tego rodzaju błędu . I oczywiście takich linków nie ma w html.
Zauważyłem też kilka interesujących faktów:
- niezdefiniowane żądania nigdy nie zostały znalezione jako odnośniki innych stron, ale zamiast tego "prawdziwe" strony zostały użyte jako odnośniki dla następującego żądania o tym samym IP (użytkownik ma możliwość korzystania z klasycznego menu na stronie 404)
- Nie widziałem żadnych śladów tych stron w Google Analytics, więc zakładam, że nie wykonano javascript (na wszystkich stronach, w tym 404, istnieje tracker)
- nikt nie skontaktował się z nami w tej sprawie, nawet kiedy przywołałem problem w sieciach społecznościowych witryny
- większość użytkowników kontynuuje wizytę po tym
Wszystkie te fakty sprawiają, że myślę, że problem występuje po cichu w przeglądarkach, prawdopodobnie wywołany przez wadliwy dodatek, program antywirusowy, pasek przeglądarki lub kiepski program producenta zintegrowany z przeglądarkami zaktualizowanymi wczoraj (ale nie znalazłem żadnego wydanego dodatku wczoraj dla Chrome, Firefoxa i IE).
Czy ktoś tutaj zauważył ten sam problem lub ma pełniejsze wyjaśnienie?
źródło
location.href.search("undefined")
jest prawdziwe). - Jeśli nie ma e-maili i wszędzie używasz jquery ajax, zawiń wywołanie jquery ajax w niestandardową funkcję, która najpierw sprawdza, czy zwrócone dane są w formacie JSON i czy data.undefinedError istnieje, a jeśli istnieje, zapisz to gdzieś (+ utwórz sprawdzenie w swoim 404, który zwraca,{undefinedError:true}
jeśli istniejeundefined
w adresie URL).Odpowiedzi:
Nie ma prostej, prostej odpowiedzi.
Będziesz musiał to debugować i prawdopodobnie jest to JavaScript ze względu na słowo „undefined” w adresie URL. Jednak nie musi to być AJAX, może to być JavaScript tworzący dowolny adres URL, który jest automatycznie rozpoznawany przez przeglądarkę (np. JavaScript, który ustawia atrybut src w tagu obrazu, ustawia atrybut css-image itp.). Używam Firefoksa z zainstalowanym Firebugiem przez większość czasu, więc moje wskazówki będą miały to na uwadze.
Konfiguracja początkowa Firebug
Pomiń to, jeśli wiesz już, jak używać Firebuga.
Po zainstalowaniu i ponownym uruchomieniu Firefoksa dla Firebug, będziesz musiał włączyć większość „paneli” Firebuga. Aby otworzyć Firebuga, w prawym górnym rogu przeglądarki pojawi się mały pożar / owad wyglądający jak błąd lub możesz nacisnąć F12. Klikaj na zakładkach Firebug „Konsola”, „Skrypt”, „Sieć” i włącz je, otwierając je i odczytując informacje z panelu. Może być konieczne odświeżenie strony, aby działały prawidłowo.
Debugowanie interakcji użytkownika
Przejdź do jednej ze stron, na której występuje problem z otwartą aplikacją Firebug i aktywnym panelem Sieć. W panelu Net będzie kilka opcji: „Wyczyść”, „Utrwalaj”, „Wszystko”, „Html” itd. Upewnij się, że wybrana jest opcja WSZYSTKIE. Nie rób niczego na stronie i staraj się niczego na niej nie przesuwać. Przejrzyj prośby. Żądanie dotyczące nieprawidłowego adresu URL będzie czerwone i prawdopodobnie będzie miało stan 404 Nie znaleziono (lub podobny).
Widzisz to podczas ładowania? Przejdź do następnej części.
Nie widzisz tego podczas początkowego ładowania? Zacznij korzystać ze swojej strony i kontynuuj tutaj.
Zacznij klikać każdą funkcję, najedź myszką na wszystko itp. Spójrz na panel sieci i wypatruj żądań, które się nie udają. Być może będziesz musiał wykazać się kreatywnością, ale kontynuuj korzystanie z aplikacji, aż zobaczysz, że przeglądarka wysyła nieprawidłowe żądanie. Jeśli strona zawiera wiele żądań, możesz nacisnąć przycisk „Wyczyść” w lewym górnym rogu panelu sieci, aby nieco go wyczyścić.
Jeśli po przesłaniu strony zobaczysz, że nieudane żądanie zniknie bardzo szybko, ale zostanie utracone, ponieważ wczytuje się następna strona, włącz utrwalanie, klikając opcję „Utrwal” w lewym górnym rogu panelu Sieć.
Kiedy to nastąpi, a powinno, zastanów się, co zrobiłeś, aby to się stało. Sprawdź, czy możesz to powtórzyć. Gdy już zorientujesz się, jakie działania powodują interakcja użytkownika, zanurz się w tym kodzie i zacznij szukać rzeczy, które powodują nieprawidłowe żądania.
Możesz użyć zakładki Skrypt, aby ustawić punkty przerwania w swoim JavaScript i przechodzić przez nie. Zbadaj procedury obsługi zdarzeń wykonane za pomocą $ (elemment) .bind / click / focus / etc lub z atrybutów zdarzeń starej szkoły, takich jak onclick = "" / onfocus = "" itp.
Jeśli żądanie jest realizowane zaraz po załadowaniu strony
To będzie trochę trudniejsze do ustalenia. Będziesz musiał przejść do zakładki Skrypt i rozpocząć dodawanie punktów przerwania do każdego skryptu uruchamianego podczas ładowania. Robisz to klikając po lewej stronie linii JavaScript.
Załaduj ponownie stronę, a punkty przerwania powinny powstrzymać przeglądarkę przed załadowaniem strony. Naciśnij przycisk „Kontynuuj” na panelu skryptów. Przejdź do panelu sieci i sprawdź, czy żądanie zostało wysłane, kontynuuj, aż zostanie znalezione. Możesz użyć tego, aby zawęzić, skąd jest tworzone żądanie, powoli dodając coraz więcej punktów przerwania, a następnie wchodząc i wychodząc z funkcji.
Czego szukasz w swoim kodzie
Coś podobnego do następującego:
var url = workingUrl + someObject['someProperty']; var url = workingUrl + someObject.someProperty;
Pamiętaj, że someObject może być obiektem
{}
, tablicą[]
lub dowolnym rodzajem przeglądarki wewnętrznej. Chodzi o to, że zostanie uzyskany dostęp do właściwości, która nie istnieje.Nie widzę żadnych żądań 404 / czerwonych
Zatem cokolwiek powoduje, nie jest wyzwalane przez twoje testy. Spróbuj użyć więcej rzeczy. Chodzi o to, że powinieneś być w stanie w jakiś sposób zrealizować żądanie. Po prostu jeszcze nie wiesz. Musi pojawić się w panelu sieci. Nie dzieje się tak tylko wtedy, gdy nie robisz tego, co go uruchamia.
Wniosek
Nie ma bardzo łatwego sposobu na ustalenie, co dokładnie się dzieje. Jednak stosując metody, które przedstawiłem, powinieneś przynajmniej być w stanie podejść bliżej. Prawdopodobnie jest to coś, czego nawet nie rozważasz.
źródło
var url = omeObject['usuallyAURL'];
, a to jest ustawiane jako src lub href jakiegoś żądanego zasobu, a zatem jest traktowane jako żądanie ścieżki względnej. tj.<img src="undefined" />
Na podstawie tego posta dokonałem inżynierii wstecznej wtyczki / złośliwego oprogramowania „Complitly” do Chrome i stwierdziłem, że to rozszerzenie wprowadza ulepszoną funkcję autouzupełniania, która generuje „niezdefiniowane” żądania w każdej witrynie, w której pole tekstowe jest oznaczone jako NAME lub Identyfikator „wyszukiwania”, „q” i wiele innych.
Odkryłem również, że plik enable.js (jeden z kompletnych plików) sprawdzał zmienną globalną o nazwie „Suggestmeyes_loaded”, aby zobaczyć, czy jest już załadowana (jak Singleton). Zatem ustawienie tej zmiennej na false wyłącza wtyczkę.
Aby wyłączyć złośliwe oprogramowanie i zatrzymać „niezdefiniowane” żądania, zastosuj to do każdej strony z polem wyszukiwania w swojej witrynie:
<script type="text/javascript"> window.suggestmeyes_loaded = true; </script>
To złośliwe oprogramowanie przekierowuje również użytkowników do witryny „searchcompletion.com”, czasami wyświetlając reklamy konkurencji. Dlatego należy to traktować poważnie.
źródło
Prawidłowo ustaliłeś, że
undefined
problem dotyczy JavaScript i jeśli użytkownicy Twojej witryny nie skarżyli się na wyświetlanie stron błędów, możesz sprawdzić następujące kwestie.Kiedy tak się stanie, przeglądarka z radością spróbuje załadować obraz (bez nagłówków AJAX), ale pozostawi wskazówki: ustawia określony
Accept:
nagłówek; zamiasttext/html, text/xml, ...
tego użyjeimage/jpeg, image/png, ...
.Po potwierdzeniu takiego nagłówka ograniczyłeś problem tylko do obrazów. Znalezienie przyczyny zajmie jednak trochę czasu :)
Aktualizacja
Aby ułatwić debugowanie, możesz przesłonić
$.fn.attr()
i wywołać debuger, gdy coś jest przypisane do undefined. Coś takiego:(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));
źródło
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 [...]
Ale w IE9 nagłówek Accept odwołuje się do obrazu: WAccept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
przyszłym tygodniu poświęcę trochę czasu na zbadanie strony obrazów. Dzięki!Kilka faktów, które zostały ustalone, szczególnie w tym wątku: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ
dzieje się tak na stronach, które w ogóle nie zawierają javascript. dowodzi to, że nie jest to błąd programowania na stronie
użytkownik jest nieświadomy problemu i kontynuuje przeglądanie całkiem szczęśliwie.
dzieje się to kilka sekund po tym, jak osoba odwiedza stronę.
nie zdarza się to każdemu.
dzieje się na wielu przeglądarkach (Chrome, IE, Firefox, Mobile Safari, Opera)
dzieje się na wielu systemach operacyjnych (Linux, Android, NT)
dzieje się na wielu serwerach internetowych (IIS, Nginx, Apache)
W jednym przypadku Googlebot podążał za linkiem i twierdził, że ten sam odsyłający. Mogą po prostu próbować być sprytni, a przeglądarka przekazała to statkowi-matce, który następnie wysłał bota do zbadania.
Jestem dość przekonany co do propozycji, że jest to spowodowane wtyczkami. Całkowicie to jedno, ale to nie obsługuje Opery. Jest wielu innych.
Chociaż przeglądarki mobilne są sprzeczne z teorią wtyczek.
Administratorzy systemów zgłosili poważny spadek, dodając trochę javascript na stronie, aby oszukać Complitly, myśląc, że jest już zainicjowany.
Oto moje rozwiązanie dla nginx:
location ~ undefined/?$ { return 204; }
Zwraca to „tak, w porządku, ale brak treści dla ciebie”.
Jeśli jesteś na website.com/some/page i (w jakiś sposób) przejdziesz do website.com/some/page/undefined, przeglądarka pokaże zmieniony adres URL, ale nawet nie przeładuje strony. Poprzednia strona pozostanie bez zmian w oknie.
Jeśli z jakiegoś powodu jest to coś, czego doświadczają użytkownicy, będą mieli czyste doświadczenie noop i nie będą przeszkadzać w tym, co robili.
źródło
To brzmi jak sytuacja wyścigu, w której zmienna nie jest poprawnie inicjalizowana przed użyciem. Biorąc pod uwagę, że zgodnie z Twoimi komentarzami nie jest to problem z AJAX, będzie kilka sposobów, aby to rozwiązać, wymienionych poniżej.
Podłącz rejestrator wyjątków JavaScript : pomoże ci to złapać prawie wszystkie przypadkowe wyjątki javascript w twoim dzienniku. W większości przypadków pojawiają się tutaj błędy programistyczne. Umieść to przed jakimikolwiek skryptami. Będziesz musiał przechwycić je na serwerze i wydrukować w swoich dziennikach w celu późniejszej analizy. To twoja pierwsza linia obrony. Oto przykład:
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); };
Wyszukaj window.location : dla każdej z tych instancji należy dodać rejestrowanie lub sprawdzić niezdefiniowane konkatacje / dopełniacze do pliku window.location. Na przykład:
function myCode(loc) { // window.location.href = loc; // old typeof loc === 'undefined' && window.onerror(...); //new window.location.href = loc; //new }
lub nieco czystszy:
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 }
Jeśli jesteś zainteresowany uzyskaniem stacktraces na tym etapie, spójrz na: https://github.com/eriwen/javascript-stacktrace
Chwyć wszystkie nieobsłużone, niezdefiniowane linki : Oprócz window.location Pozostały tylko same linki DOM. Trzecim krokiem jest sprawdzenie wszystkich niezawieszonych linków DOM pod kątem nieprawidłowego wzorca adresu URL (możesz to załączyć zaraz po zakończeniu ładowania jQuery, wcześniej lepiej):
$("body").on("click", "a[href$='undefined']", function() { window.onerror('Bad link: ' + $(this).html()); //alert home base });
Mam nadzieję, że to jest pomocne. Miłego debugowania.
źródło
Zastanawiam się, czy może to być problem z blokadą reklam. Kiedy przeszukuję dzienniki według adresu IP, okazuje się, że po każdym żądaniu określonego użytkownika do /folder/page.html następuje żądanie do / folder / undefined
źródło
Nie wiem, czy to pomaga, ale moja witryna zastępuje jeden konkretny plik obrazu * .webp plikiem undefined po załadowaniu go w wielu przeglądarkach. Czy Twoja witryna obsługuje obrazy w sieci Web?
źródło
Miałem podobny problem (ale z
/null
błędami 404 w konsoli), który odpowiedź @ andrew-martinez pomogła mi rozwiązać.Okazuje się, że użyłem
img
tagów z pustymsrc
polem:<img src="" alt="My image" data-src="/images/my-image.jpg">
Mój pomysł polegał na tym, aby uniemożliwić przeglądarce ładowanie obrazu podczas ładowania strony w celu ręcznego załadowania później, ustawiając atrybut src z atrybutu data-src za pomocą javascript (ładowanie z opóźnieniem). Ale w połączeniu z iDangerous Swiper ta metoda spowodowała błąd.
źródło