自12六月2012 11:20 TU,我看到非常奇怪的错误在我的清漆/Apache日志.
有时候,当一个用户请求了一个页面,几秒钟后我会看到一个类似的请求,但是url中最后一个/之后的all字符串已经被替换为“undefined”。
例如:**http://example.com/foo/bar触发http://example.com/foo/undefined**请求。
当然,这些“未定义”的页面并不存在,而是返回了我的404页面(这是一个标准布局的自定义页面,而不是经典的Apache 404)
- 这种情况发生在任何页面(从主页到最深处)
- 有各种浏览器,(主要是Chrome 19,但也有firefox 3. 5到12,IE 8/9...)但只有1%的流量。
- 这些请求发送的头是经典的头(并且没有 AJAX 头)。
- 对于给定的IP,这似乎随机发生:有时在访问的第一页,有时在访问期间的随机页面,有时在访问期间的几页...
当然,这看起来像是javascript的问题(我使用的是google的jquery 1.7.2),但是**我的js/html和服务器配置都没有任何变化,**我以前从来没有见过这样的错误,当然,html中也没有这样的链接。
我还注意到一些有趣的事实:
- 未定义的请求从未被发现作为其他页面的引用,而是“真实的”页面被用作同一IP的以下请求的引用(用户能够使用404页面上的经典菜单)
- 我没有看到任何跟踪这些网页在谷歌分析,所以我假设没有javascript已被执行(跟踪器存在的所有网页,包括404)
- 没有人就此事联系我们,即使我在网站的社交网络上提出这个问题
- 大多数用户在那之后继续访问
所有这些事实让我认为这个问题发生在浏览器默默,可能是由一个错误的附加组件,防病毒,浏览器栏或蹩脚的制造商软件集成在昨天更新的浏览器(但我没有发现任何附加组件昨天发布的 chrome ,火狐和IE)。
在座有没有人注意到同样的问题,或者有更完整的解释?
8条答案
按热度按时间suzh9iv81#
没有简单直接的答案。
你将不得不对此进行调试,由于URL中的"未定义"一词,它可能是JavaScript。然而,它不一定是AJAX,它可以是JavaScript,创建任何由浏览器自动解析的URL(例如,在图像标签上设置src属性、设置css-image属性等的JavaScript)。我使用的Firefox大多数时候都安装了Firebug,所以我的指示会考虑到这一点。
在安装并重新启动Firefox for Firebug之后,您需要启用Firebug的大部分"面板"。要打开Firebug,您的浏览器右上角会出现一个小的Firebug/昆虫外观的东西,或者您可以按F12。单击Firebug选项卡"控制台"、"脚本"、"Net"并通过打开它们并读取面板信息来启用它们。您可能需要刷新页面才能使它们正常工作。
导航到其中一个页面,该页面有Firebug打开且Net面板处于活动状态的问题。在Net面板中将有几个选项:"清除"、"保留"、"全部"、"html"等。确保选择了"全部"。不要在页面上执行任何操作,也不要将鼠标悬停在页面上的任何内容上。查看请求。无效URL的请求将显示为红色,状态可能为404未找到(或类似状态)。
在加载时看到了吗?跳到下一部分。
在初始加载时看不到它?开始使用您的页面并在此处继续。
开始点击每一个功能,鼠标在每一个地方,等等。保持你的眼睛在网络面板上,并注意失败的请求。你可能必须有创造性,但继续使用你的应用程序,直到你看到你的浏览器作出无效的请求。如果页面作出了许多请求,随时点击'清除'按钮在左上角的网络面板,以清除它一点。
如果您提交页面后发现一个失败的请求很快就发出了,但由于加载下一个页面而丢失了它,请通过单击Net面板左上角的"Persist'"启用持久性。
一旦它发生了,它应该,考虑你做了什么使它发生。看看你是否可以让它再次发生。在你弄清楚是什么用户交互使它发生之后,深入到代码中,开始寻找发出无效请求的东西。
你可以使用脚本选项卡在JavaScript中设置断点并逐步执行。通过$(elemment). bind/click/focus/etc或从像onclick =""/onfocus =""等老式事件属性来研究事件处理程序。
这将是一个有点难钉下来。你将需要去脚本标签,并开始添加断点到每个脚本运行的负载。你这样做是通过点击左边的JavaScript行。
重新加载您的页面,您的断点应该会阻止浏览器加载该页面。请按脚本面板上的"继续"按钮。转到网络面板,查看您的请求是否已发出,继续操作直到找到为止。您可以使用此功能,通过慢慢添加越来越多的断点,然后逐步进入和退出函数,来缩小发出请求的位置。
类似于以下内容的事物:
记住someObject可能是一个对象
{}
、一个数组[]
或任何内部浏览器类型,关键是将访问一个不存在的属性。那么无论是什么原因,它都不是由你的测试触发的。尝试使用更多的东西。关键是你应该能够以某种方式使请求发生。你只是还不知道。它必须显示在Net面板中。唯一不会的时候是当你没有做任何触发它的事情时。
没有一个超级简单的方法来确定到底发生了什么。但是,使用我概述的方法,你至少应该能够接近。这可能是你甚至没有考虑过的事情。
ghg1uchk2#
基于这个post,我逆向工程“Complitly”Chrome插件/恶意软件,发现这个扩展注入了一个“改进的自动完成”功能,该功能在每个具有名称或ID为“搜索”,“q”和许多其他输入文本字段的网站上抛出“未定义”请求。
我还发现enable.js文件(编译文件之一)正在检查一个名为“suggestmeyes_loaded”的全局变量,以查看它是否已经加载(就像Singleton一样)。
要禁用恶意软件并停止“未定义”的请求,请将此应用到您网站上具有搜索字段的每个页面:
这种恶意软件还会将用户重定向到“searchcompletion.com“网站,有时会显示竞争对手的广告。因此,应该认真对待它。
os8fio9y3#
您已经正确地确定
undefined
与JavaScript问题有关,如果您的站点用户没有抱怨看到错误页面,您可以检查以下内容。如果使用JavaScript设置或更改图像位置,有时会发生
undefined
进入URI的情况。当这种情况发生时,浏览器会很乐意尝试加载图像(没有AJAX头),但会留下提示:它设置特定的
Accept:
报头;它将使用image/jpeg, image/png, ...
来代替text/html, text/xml, ...
。一旦确认了这样的标题,你就把问题缩小到了图像范围。不过,找到根本原因可能需要一些时间:)
为了帮助调试,你可以重写
$.fn.attr()
,并在一些东西被赋值给undefined时调用调试器。5lhxktic4#
一些事实已经确立,特别是在这个线程:http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ
它发生在没有javascript的页面上.这证明它不是一个页面上的编程错误
用户不知道该问题,并继续相当愉快地浏览。
它发生在用户访问页面之后的几秒钟。
并不是每个人都这样。
在多个浏览器(Chrome、IE、Firefox、移动的Safari、Opera)上发生
在多个操作系统(Linux、Android、NT)上发生
发生在多个Web服务器上(IIS、Nginx、Apache)
我有一个案例,谷歌机器人跟踪链接,并声称相同的推荐人。他们可能只是想变聪明,浏览器将其传达给母舰,然后母舰启动了一个机器人进行调查。
我很确信这是由插件引起的。完全是一个,但它不支持Opera。还有很多其他的插件。
尽管移动的浏览器与插件理论相悖。
系统管理员报告说,通过在页面上添加一些javascript来欺骗Complitly,使其认为已经初始化,这是一个重大的下降。
下面是我的nginx解决方案:
这将返回“是的,可以,但没有适合您的内容”。
如果你在www.example.com上website.com/some/page,你(以某种方式)导航到website.com/some/page/undefined,浏览器会显示修改后的URL,但甚至不会重新加载页面。
如果出于某种原因,这是用户所经历的事情,那么他们将有一个干净的noop体验,它不会打扰他们正在做的任何事情。
fquxozlt5#
这听起来像是一个竞态条件,即变量在使用前没有得到正确的初始化。根据您的评论,考虑到这不是一个 AJAX 问题,将有几种方法来解决这个问题,如下所列。
连接Javascript异常记录器:这将帮助你捕获日志中所有随机的javascript异常。2大多数时候程序错误会在这里冒出来。3把它放在任何脚本之前。4你需要在服务器上捕获这些异常,并把它们打印到你的日志中以便以后分析。5这是你的第一道防线。6下面是一个例子:
搜索窗口位置:对于每一个这样的示例,你应该在你的window. location中添加日志记录或检查未定义的concat/appender。2例如:
或者稍微干净一点的
如果您对在此阶段获取堆栈跟踪感兴趣,请查看:https://github.com/eriwen/javascript-stacktrace
获取所有未处理的未定义链接:除了window.location之外,剩下的就是DOM链接本身了。第三步是检查所有未经处理的DOM链接是否存在无效的URL模式(可以在jQuery完成加载后立即附加此链接,越早越好):
希望这对你有帮助。调试愉快。
rks48beu6#
我想知道这是否是广告拦截程序的问题。当我按IP地址搜索日志时,发现每个特定用户对/folder/page. html的请求后都有一个对/folder/undefined的请求
6ss1mwsb7#
我不知道这是否有帮助,但我的网站在多个浏览器加载后,将一个特定的 *.webp图像文件替换为undefined。您的网站托管webp图像吗?
7ivaypg98#
我也遇到过类似的问题(但是控制台中有
/null
404错误),@andrew-martinez的回答帮助我解决了这个问题。原来我使用的是
img
标签和一个空的src
字段:<img src="" alt="My image" data-src="/images/my-image.jpg">
我的想法是通过javascript设置data-src属性中的src属性(延迟加载)来防止浏览器在页面加载时加载图像,以便稍后手动加载。但当与iDangerous Swiper结合使用时,该方法导致了错误。