Desde el 12 de junio de 2012 a las 11:20 TU, veo errores muy extraños en mis registros de barniz / apache.
A veces, cuando un usuario ha solicitado una página, varios segundos después veo una solicitud similar, pero la cadena all después de la última / en la URL ha sido reemplazada por "indefinida".
Ejemplo: http://example.com/foo/bar activa una solicitud http://example.com/foo/undefined .
Por supuesto, estas páginas "no definidas" no existen y mi página 404 se devuelve en su lugar (que es una página personalizada con un diseño estándar, no un apache 404 clásico)
- Esto sucede con cualquier página (desde la página de inicio hasta la más profunda)
- con varios navegadores, (principalmente Chrome 19, pero también Firefox 3.5 a 12, IE 8/9 ...) pero solo el 1% del tráfico.
- Los encabezados enviados por estas solicitudes son encabezados clásicos (y no hay encabezados ajax).
- Para una IP determinada, esto parece ocurrir al azar: a veces en la primera página visitada, a veces en una página aleatoria durante la visita, a veces varias páginas durante la visita ...
Por supuesto, parece un problema de javascript (estoy usando jquery 1.7.2 alojado por google), pero no he cambiado absolutamente nada en js / html o en la configuración del servidor desde hace varios días y nunca vi este tipo de error antes . Y, por supuesto, no existen tales enlaces en el html.
También noté algunos hechos interesantes:
- las solicitudes no definidas nunca se encuentran como referente de otras páginas, sino que las páginas "reales" se usaron como referente para la siguiente solicitud de la misma IP (el usuario tiene la capacidad de usar el menú clásico en la página 404)
- No vi ningún rastro de estas páginas en Google Analytics, por lo que supongo que no se ha ejecutado JavaScript (el rastreador existe en todas las páginas, incluida la 404)
- nadie nos ha contactado sobre esto, aun cuando invoqué el problema en las redes sociales del sitio web
- la mayoría de los usuarios continúan la visita después de eso
Todos estos hechos me hacen pensar que el problema ocurre silenciosamente en los navegadores, probablemente provocado por un complemento con errores, antivirus, una barra del navegador o un fabricante de mierda integrado en los navegadores actualizados ayer (pero no encontré ningún complemento lanzado ayer para Chrome, Firefox e IE).
¿Alguien aquí ha notado el mismo problema o tiene una explicación más completa?
fuente
location.href.search("undefined")
es cierto). - Si no hay correos electrónicos y usa jquery ajax en todas partes, envuelva la llamada de jquery ajax en una función personalizada que primero verifique si los datos devueltos son un JSON y si data.undefinedError existe y, si existe, regístrelo en algún lugar (+ cree un cheque en su 404 que devuelve{undefinedError:true}
si hayundefined
en la url).Respuestas:
No hay una respuesta sencilla y directa.
Tendrá que depurar esto y probablemente sea JavaScript debido a la palabra 'indefinida' en la URL. Sin embargo, no tiene que ser AJAX, podría ser JavaScript creando cualquier URL que sea resuelta automáticamente por el navegador (por ejemplo, JavaScript que establece el atributo src en una etiqueta de imagen, configura un atributo css-image, etc.). Utilizo Firefox con Firebug instalado la mayor parte del tiempo, por lo que mis instrucciones serán teniendo eso en cuenta.
Configuración inicial de Firebug
Omita esto si ya sabe cómo usar Firebug.
Después de la instalación y reiniciar Firefox para Firebug, tendrás que habilitar la mayoría de los 'paneles' de Firebug. Para abrir Firebug, habrá una pequeña cosa con apariencia de insecto / bicho de fuego en la esquina superior derecha de su navegador o puede presionar F12. Haga clic en las pestañas de Firebug 'Consola', 'Script', 'Net' y habilítelas abriéndolas y leyendo la información del panel. Es posible que deba actualizar la página para que funcionen correctamente.
Depurar la interacción del usuario
Navega a una de las páginas que tiene el problema con Firebug abierto y el panel Net activo. En el panel de red habrá algunas opciones: 'Borrar', 'Persistir', 'Todo', 'Html', etc. Asegúrese de que TODO esté seleccionado. No hagas nada en la página y trata de no pasar el mouse sobre nada en ella. Revise las solicitudes. La solicitud de la URL no válida aparecerá en rojo y probablemente tendrá un estado de 404 No encontrado (o similar).
¿Lo ves en carga? Pase a la siguiente parte.
¿No lo ve en la carga inicial? Comience a usar su página y continúe aquí.
Empiece a hacer clic en cada función, pase el ratón sobre todo, etc. Mantenga los ojos en el panel de red y observe si las solicitudes fallan. Puede que tenga que ser creativo, pero continúe usando su aplicación hasta que vea que su navegador hace una solicitud no válida. Si la página realiza muchas solicitudes, siéntase libre de presionar el botón 'Borrar' en la parte superior izquierda del panel de Red para aclararlo un poco.
Si envía la página y ve una solicitud fallida que sale muy rápido pero luego la pierde porque se carga la página siguiente, habilite la persistencia haciendo clic en 'Persistir' en la parte superior izquierda del panel de red.
Una vez que lo haga, y debería, considere lo que hizo para que eso sucediera. Vea si puede hacer que vuelva a suceder. Después de averiguar qué interacción del usuario está haciendo que suceda, sumérjase en ese código y comience a buscar cosas que estén realizando solicitudes no válidas.
Puede usar la pestaña Script para configurar puntos de interrupción en su JavaScript y recorrerlos. Investigue los controladores de eventos realizados a través de $ (elemment) .bind / click / focus / etc o de los atributos de eventos de la vieja escuela como onclick = "" / onfocus = "" etc.
Si la solicitud se produce tan pronto como se carga la página
Esto va a ser un poco más difícil de fijar. Deberá ir a la pestaña Script y comenzar a agregar puntos de interrupción a cada script que se ejecuta en carga. Haz esto haciendo clic en el lado izquierdo de la línea de JavaScript.
Vuelva a cargar su página y sus puntos de interrupción deberían evitar que el navegador cargue la página. Presione el botón 'Continuar' en el panel de secuencia de comandos. Vaya a su panel de red y vea si su solicitud fue realizada, continúe hasta que la encuentre. Puede usar esto para reducir el lugar desde el que se realiza la solicitud agregando lentamente más y más puntos de interrupción y luego entrando y saliendo de funciones.
Lo que buscas en tu código
Algo que sea similar a lo siguiente:
var url = workingUrl + someObject['someProperty']; var url = workingUrl + someObject.someProperty;
Tenga en cuenta que someObject puede ser un objeto
{}
, una matriz[]
o cualquiera de los tipos de navegadores internos. El caso es que se accederá a una propiedad que no existe.No veo ninguna solicitud 404 / roja
Entonces, lo que sea que lo esté causando, sus pruebas no lo activan. Intente usar más cosas. El punto es que debería poder hacer que la solicitud suceda de alguna manera. Simplemente no lo sabes todavía. Tiene que aparecer en el panel Net. La única vez que no lo hará es cuando no está haciendo lo que lo desencadena.
Conclusión
No existe una manera muy fácil de determinar qué está sucediendo exactamente. Sin embargo, utilizando los métodos que describí, al menos debería poder acercarse. Probablemente sea algo que ni siquiera estás considerando.
fuente
var url = omeObject['usuallyAURL'];
, y que se establezca como src o href de algún activo solicitado y, por lo tanto, se trate como una solicitud de ruta relativa. es decir,<img src="undefined" />
Según esta publicación , realicé ingeniería inversa del complemento / malware de Chrome "Complitly" y descubrí que esta extensión está inyectando una función de "autocompletado mejorado" que arrojaba solicitudes "indefinidas" en cada sitio que tiene un campo de texto de entrada con NAME o ID de "búsqueda", "q" y muchos otros.
También encontré que el archivo enable.js (uno de los archivos complitly) estaba comprobando una variable global llamada "Sugieremeyes_cargado" para ver si ya está cargado (como un Singleton). Por lo tanto, establecer esta variable en falso deshabilita el complemento.
Para deshabilitar el malware y detener las solicitudes "indefinidas", aplique esto a cada página con un campo de búsqueda en su sitio:
<script type="text/javascript"> window.suggestmeyes_loaded = true; </script>
Este malware también redirige a sus usuarios a un sitio "searchcompletion.com", que a veces muestra anuncios de la competencia. Por lo tanto, debe tomarse en serio.
fuente
Ha establecido correctamente que se
undefined
relaciona con un problema de JavaScript y si los usuarios de su sitio no se han quejado de ver páginas de error, puede verificar lo siguiente.Cuando eso suceda, el navegador intentará felizmente cargar la imagen (sin encabezados AJAX), pero dejará pistas: establece un
Accept:
encabezado particular ; en lugar detext/html, text/xml, ...
usarloimage/jpeg, image/png, ...
.Una vez que se confirma dicho encabezado, se ha reducido el problema a imágenes únicamente. Sin embargo, encontrar la causa raíz posiblemente llevará algún tiempo :)
Actualizar
Para ayudar con la depuración, puede anular
$.fn.attr()
e invocar al depurador cuando se asigna algo a undefined. Algo como esto:(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));
fuente
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 [...]
Pero con IE9, aceptar referencias de encabezado a una imagen: laAccept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
próxima semana me tomaré un tiempo para investigar el lado de las imágenes. ¡Gracias!Algunos hechos que se han establecido, especialmente en este hilo: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ
sucede en páginas que no tienen javascript en absoluto. esto prueba que no es un error de programación en la página
el usuario no es consciente del problema y continúa navegando con bastante alegría.
sucede unos segundos después de que la persona visita la página.
no le pasa a todo el mundo.
ocurre en varios navegadores (Chrome, IE, Firefox, Mobile Safari, Opera)
ocurre en múltiples sistemas operativos (Linux, Android, NT)
ocurre en múltiples servidores web (IIS, Nginx, Apache)
Tengo un caso de googlebot siguiendo el enlace y reclamando la misma referencia. Es posible que solo estén tratando de ser inteligentes y el navegador se lo comunicó a la nave nodriza, quien luego estableció un bot para investigar.
Estoy bastante convencido por la propuesta de que es causado por complementos. Complitly es uno, pero eso no es compatible con Opera. Hay muchos otros.
Aunque los navegadores móviles pesan en contra de la teoría de los complementos.
Los administradores de sistemas han informado de una caída importante al agregar algo de javascript en la página para engañar a Complitly para que piense que ya está inicializado.
Aquí está mi solución para nginx:
location ~ undefined/?$ { return 204; }
Esto devuelve "sí, está bien, pero no hay contenido para ti".
Si está en website.com/some/page y (de alguna manera) navega a website.com/some/page/undefined, el navegador mostrará la URL modificada, pero ni siquiera volverá a cargar la página. La página anterior permanecerá como estaba en la ventana.
Si por alguna razón esto es algo que los usuarios experimentan, entonces tendrán una experiencia noop limpia y no perturbará lo que estén haciendo.
fuente
Esto suena como una condición de carrera en la que una variable no se inicializa correctamente antes de ser utilizada. Teniendo en cuenta que este no es un problema de AJAX según sus comentarios, habrá un par de formas de resolverlo, que se enumeran a continuación.
Conecta un registrador de excepciones de Javascript : esto te ayudará a detectar casi todas las excepciones de JavaScript aleatorias en tu registro. La mayoría de las veces, aparecerán errores de programación aquí. Ponlo antes de cualquier guión. Deberá capturarlos en el servidor e imprimirlos en sus registros para analizarlos más tarde. Esta es tu primera línea de defensa. Aquí hay un ejemplo:
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); };
Busque window.location : para cada una de estas instancias, debe agregar registro o verificar concats / anexos no definidos en su window.location. Por ejemplo:
function myCode(loc) { // window.location.href = loc; // old typeof loc === 'undefined' && window.onerror(...); //new window.location.href = loc; //new }
o el ligeramente más limpio:
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 }
Si está interesado en obtener trazas de pila en esta etapa, eche un vistazo a: https://github.com/eriwen/javascript-stacktrace
Coge todos los enlaces indefinidos no gestionados : además de window.location Lo único que queda son los enlaces DOM. El tercer paso es verificar todos los enlaces DOM sin control para su patrón de URL no válido (puede adjuntar esto justo después de que jQuery termine de cargarse, antes mejor):
$("body").on("click", "a[href$='undefined']", function() { window.onerror('Bad link: ' + $(this).html()); //alert home base });
Espero que esto sea útil. Feliz depuración.
fuente
Me pregunto si esto podría ser un problema de bloqueador de anuncios. Cuando busco en los registros por dirección IP, parece que cada solicitud de un usuario en particular a /folder/page.html va seguida de una solicitud a / folder / undefined
fuente
No sé si esto ayuda, pero mi sitio web está reemplazando un archivo de imagen * .webp en particular por indefinido después de que se carga en varios navegadores. ¿Su sitio aloja imágenes webp?
fuente
Tuve un problema similar (pero con
/null
errores 404 en la consola) que la respuesta de @ andrew-martinez me ayudó a resolver.Resulta que estaba usando
img
etiquetas con unsrc
campo vacío :<img src="" alt="My image" data-src="/images/my-image.jpg">
Mi idea era evitar que el navegador cargara la imagen al cargar la página para cargarla manualmente más tarde configurando el atributo src del atributo data-src con javascript (carga diferida). Pero cuando se combina con iDangerous Swiper, ese método causó el error.
fuente