“未定义”自2012年6月12日起随机附加在我网站上所请求的url的1%之内

自2012年6月12日11:20恩,我看到我的varnish / apache日志非常奇怪的错误。

有时,当用户请求一个页面,几秒钟后,我看到一个类似的请求,但最后/在URL中的所有string已被“未定义”取代。

例如: http : //example.com/foo/bar会触发http://example.com/foo/undefined请求。

当然,这些“未定义”页面不存在,我的404页面被返回(这是一个标准的布局自定义页面,而不是经典的Apache 404)

  • 这发生在任何页面(从主页到最深处)
  • 与各种浏览器,(主要是铬19,但也Firefox 3.5至12,IE 8/9 …),但只有1%的交通。
  • 这些请求发送的头是经典的头(没有Ajax头)。
  • 对于一个给定的IP,这似乎是随机发生的:有时在访问的第一页,有时访问期间的随机页面,有时在访问期间的几页…

当然,它看起来像一个JavaScript问题(我使用由谷歌托pipe的jquery 1.7.2),但我绝对没有改变js / html或服务器configuration几天以来,我从来没有见过这种错误之前。 当然,在html中没有这样的链接。

我也注意到一些有趣的事实:

  • 未定义的请求永远不会被认为是另一个页面的引用者,而是“真实”页面被用作相同IP的以下请求的引用者(用户能够使用404页面上的经典菜单)
  • 我在Google Analytics中没有看到这些页面的任何痕迹,所以我认为没有执行任何JavaScript(所有页面上都包含404跟踪器)
  • 即使我在网站的社交networking中引用了这个问题,也没有人联系过我们
  • 大部分用户在此之后继续访问

所有这些事实让我觉得这个问题悄然发生在浏览器,可能是由一个错误的附加组件,防病毒软件,浏览器栏或一个蹩脚的制造商软件集成在昨天更新的浏览器(但我没有find任何附加组件昨天为铬,Firefox和IE)。

这里有没有人注意到同样的问题,或者有更完整的解释?

没有简单的直接答案。

你将不得不去debugging,这可能是由于URL中的“未定义”字的JavaScript。 然而,它不一定是AJAX,它可能是JavaScript创build任何由浏览器自动parsing的URL(例如,在图像标签上设置src属性的JavaScript,设置css-image属性等)。 我大部分时间都使用安装Firebug的 Firefox ,所以我的方向是考虑到这一点。

Firebug初始设置

如果您已经知道如何使用Firebug,请跳过此步骤。

在Firebug安装并重新启动Firefox之后,您将不得不启用大部分Firebug的“面板”。 要打开Firebug,浏览器的右上angular会出现一个小火虫/虫子,或者你可以按F12。 点击“Firebug”选项卡的“控制台”,“脚本”,“networking”,打开并阅读面板信息启用它们。 您可能需要刷新页面才能正常工作。

debugging用户交互

浏览到Firebug打开并且networking面板处于活动状态的页面之一。 在networking面板中会有几个选项:“清除”,“持续”,“全部”,“Html”等。确保select了ALL。 不要在页面上做任何事情,并尽量不要把它放在任何东西上。 查看请求。 对无效URL的请求将是红色的,可能具有404 Not Found(或类似)的状态。

在负载上看到它? 跳到下一部分。

在初始加载时没有看到它? 开始使用你的网页,并继续在这里。

开始点击每个function,将鼠标放在所有内容上等等。把你的眼睛放在networking面板上,观察失败的请求。 您可能必须具有创造性,但请继续使用您的应用程序,直到您看到您的浏览器发出无效请求。 如果页面提出了很多请求,可以点击networking面板左上方的“清除”button清除它。

如果您提交页面并看到失败的请求,则非常快速,但是由于下一页加载而丢失,通过单击“networking”面板左上angular的“持续”来启用持久性。

一旦它发生了,它应该考虑你做了什么来实现这一点。 看看你能否再次发生。 在确定用户交互正在发生之后,深入该代码并开始寻找造成无效请求的事物。

您可以使用“脚本”选项卡在JavaScript中设置断点并逐步完成。 通过$(elemment).bind / click / focus /等来调查事件处理程序,或者从onclick =“”/ onfocus =“等旧式事件属性中调用事件处理程序。

如果请求在页面加载后立即发生

这将有点难以遏制。 您将需要转到“脚本”选项卡,并开始向加载时运行的每个脚本添加断点。 您可以通过单击JavaScript行的左侧来完成此操作。

重新加载你的页面,你的断点应该停止浏览器加载页面。 按脚本面板上的“继续”button。 去你的networking面板,看看你的请求是否已经完成,直到find。 您可以通过缓慢地添加越来越多的中断点,然后进入和退出function来缩小请求的范围。

你在你的代码中寻找什么

类似于以下内容的东西:

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

请记住,someObject可能是一个对象{} ,数组[]或任何内部浏览器types。 重点是将访问一个不存在的属性。

我没有看到任何404 /红色的请求

那么不pipe是什么原因造成的,它不会被你的testing触发。 尝试使用更多的东西。 关键是你应该能够以某种方式使请求发生。 你还不知道。 它必须在networking面板中显示。 唯一不会的是当你不做任何事情时触发它。

结论

没有超级简单的方法来确定究竟发生了什么。 但是,使用我概述的方法至less应该能够接近。 这可能是你甚至没有考虑的东西。

根据这篇文章 ,我反编译了“Complitly”Chrome插件/恶意软件,发现这个扩展注入了一个“改进的自动完成”function,在每个有NAMEinput文本字段的站点上抛出“未定义” “search”,“q”等等的ID。

我还发现,enable.js文件(complitly文件之一)正在检查一个名为“suggestmeyes_loaded”的全局variables,看看它是否已经加载(像一个单身人士)。 所以,设置这个variables为false会禁用插件。

要禁用恶意软件并停止“未定义”请求,请将此应用于网站上带有search字段的每个页面:

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

这个恶意软件还会将用户redirect到“searchcompletion.com”网站,有时会显示竞争对手ADS。 所以应该认真对待。

您已经正确地确定undefined与JavaScript问题有关,如果您的网站用户没有抱怨看到错误页面,则可以检查以下内容。

如果使用JavaScript设置或更改图像位置,则有时会发生undefined进入URI的情况。

当发生这种情况时,浏览器会很高兴地尝试加载图像(没有AJAX头),但是会留下提示:它设置一个特定的Accept:头; 而不是text/html, text/xml, ...它将使用image/jpeg, image/png, ...

一旦确认了这样的标题,就只能将问题缩小到图像。 find根本原因可能需要一段时间,虽然:)

更新

为了帮助debugging,您可以覆盖$.fn.attr()并在将某些内容分配给undefined时调用debugging器。 像这样的东西:

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

这听起来像一个竞争条件,variables在使用前没有得到正确的初始化。 根据你的意见,考虑到这不是一个AJAX问题,下面列出了一些解决这个问题的方法。

连接一个Javascriptexceptionlogging器 :这将帮助您捕获日志中的所有随机javascriptexception。 大多数时候编程错误会在这里冒泡。 把它放在任何脚本之前。 您需要在服务器上捕获这些数据,并将其打印到日志中以供日后分析。 这是你的第一道防线。 这里是一个例子:

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

searchwindow.location :对于这些实例中的每一个,您应该添加日志logging或检查未定义的concats / appender到您的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 }); 

希望这是有帮助的。 快乐debugging。

一些已经build立的事实,特别是在这个线程: http : //productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

它发生在没有JavaScript的网页上。 这certificate这不是页面上的编程错误

用户不知道这个问题,并继续浏览相当愉快。

在访问该页面之后几秒钟发生。

这不会发生在每个人身上。

发生在多个浏览器(Chrome,IE,Firefox,Mobile Safari,Opera)

发生在多个操作系统(Linux,Android,NT)

发生在多个Web服务器(IIS,Nginx,Apache)

我有一个googlebot的链接,并声称相同的引用。 他们可能只是试图变得聪明,浏览器把它传达给那些随后发起调查的机器人。

我相信这个build议是由插件引起的。 Complitly是一个,但不支持Opera。 还有其他许多人。

虽然移动浏览器权衡了插件理论。

系统pipe理员已经报告说,在页面上添加一些JavaScript来欺骗Complitly,认为它已经被初始化了。

这是我对nginx的解决scheme:

 location ~ undefined/?$ { return 204; } 

这返回“是的好,但没有你的内容”。

如果您位于website.com/some/page,并且(以某种方式)导航到website.com/some/page/undefined,则浏览器将显示已更改的URL,但不会执行页面重新加载。 上一页将保持原样。

如果由于某种原因,这是用户经历的事情,那么他们将有一个干净的诺言的经验,它不会干扰他们正在做的任何事情。

我想知道这是否是一个adblocker问题。 当我通过IP地址search日志时,看起来每个特定用户对/folder/page.html的请求后都会有一个/ folder / undefined请求

我不知道这是否有帮助,但我的网站正在取代一个特定的* .webp图像文件与多个浏览器中加载后未定义。 您的网站托pipewebp图像?

我有一个类似的问题(但在控制台/null 404错误),@ andrew-martinez的答案帮助我解决。

事实certificate,我正在使用一个空的src字段的img标签:

<img src="" alt="My image" data-src="http://img.dovov.commy-image.jpg">

我的想法是防止浏览器加载页面加载图像手动加载以后通过设置src属性从JavaScript(延迟加载)的data-src属性。 但是当与iDangerous Swiper结合时,该方法会导致错误。