自2012年6月12日起,“ undefined”随机附加在我网站上所请求网址的1%中


80

自2012年6月12日11:20 TU起,我在清漆/ Apache日志中看到非常奇怪的错误。

有时,当用户请求一页时,几秒钟后,我看到了类似的请求,但URL中最后一个/之后的所有字符串已被“ 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页面上的经典菜单)
  • 我在Google Analytics(分析)中没有看到这些页面的任何痕迹,因此我假设没有执行任何javascript(所有页面(包括404)都存在跟踪器)
  • 即使我在网站的社交网络中提到问题,也没有人联系我们
  • 之后,大多数用户继续访问

所有这些事实使我认为该问题在浏览器中默默发生,可能是由错误的插件,防病毒软件,浏览器栏或昨天更新的浏览器中集成的soft脚的制造商触发的(但我没有发现发布的任何插件)昨天适用于chrome,firefox和IE)。

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


2
页面上的一些JavaScript代码正在构造URL,并且存在一个或多个错误。软件本身无需更改,就可以由于浏览器更新,对日期/时间的敏感度,第3部分脚本的更改等原因而改变行为。在不查看代码的情况下,将不可能确切地指出问题所在。
Pointy 2012年

3
只是调试的提示/想法:-在404页上用清晰的大字体写上一条清晰的消息:“如果看到此消息,请与x @ yz联系,描述您的到达方式”(可能仅在location.href.search("undefined")为true时显示)。-如果没有电子邮件并且您到处都使用jquery ajax,则将jquery ajax调用包装到自定义函数中,该函数首先检查返回的数据是否为JSON以及data.undefinedError是否存在以及是否存在,将其记录在某处(+在您的计算机上创建一个检查404,{undefinedError:true}如果undefined网址中有则返回。
David Mulder 2012年

3
我也遇到了这种情况,而且都不认为它是机器人。两者/高速缓存/ XXXX和/未定义然而,它不仅是铬19,而且还IE 8和9

3
自6月12日以来,我也一直遇到{domain} / undefined错误。我试图从我的网站(Google Analytics(分析),adsense等)中删除所有javascript,但仍然出现错误。每天它们的数量都在增加。几乎所有错误都是由使用不同版本的Chrome的用户产生的。我怀疑它是某些扩展或加载项,但无法在我自己的PC上重现。我还提到,始终在正确的页面请求之后执行包含/ undefined的请求,并带有所有子请求(图像,css等)
Almas 2012年

3
另一份报告(也于6月12日开始):productforums.google.com/forum
#

Answers:


21

没有简单的直接答案。

您将不得不调试它,并且由于URL中的“未定义”字样,可能是JavaScript。但是,它不一定是AJAX,它可以是JavaScript创建可被浏览器自动解析的任何URL(例如,在image标签上设置src属性,在css-image属性上进行设置的JavaScript等)。我在大多数时间都使用安装了Firebug的Firefox,因此我的指导将牢记在心。

Firebug初始设置

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

在安装并重新启动Firefox for Firebug之后,您将必须启用大多数Firebug的“面板”。要打开Firebug,浏览器的右上角会出现一个小萤火虫/昆虫外观的东西,或者您可以按F12键。单击Firebug选项卡的“控制台”,“脚本”,“网络”,然后通过打开它们并阅读面板信息来启用它们。您可能必须刷新页面才能使其正常工作。

调试用户交互

导航到Firebug打开且“网络”面板处于活动状态的页面之一。在“网络”面板中,有几个选项:“清除”,“持续”,“全部”,“ HTML”等。确保选择了“全部”。不要在页面上执行任何操作,并尽量不要将鼠标悬停在页面上。查看请求。无效网址的请求将显示为红色,并且状态可能为404未找到(或类似状态)。

看到它了吗?跳到下一部分。

在初始加载时看不到它吗?开始使用您的页面,然后在此处继续。

开始单击每个功能,将鼠标悬停在所有功能上,等等。将您的注意力放在“网络”面板上,观察是否有失败的请求。您可能需要发挥创造力,但是请继续使用您的应用程序,直到看到浏览器发出无效请求为止。如果该页面发出了很多请求,请随时点击“网络”面板左上方的“清除”按钮以将其清除。

如果您提交该页面,但看到失败的请求很快就发出,但由于加载下一页而失败,请单击“ Net”面板左上方的“ Persist”以启用持久性。

一旦完成,应该考虑您为实现该目标所做的工作。看看是否可以再次实现。在弄清是什么导致了用户交互之后,请深入研究该代码并开始查找发出无效请求的内容。

您可以使用“脚本”选项卡在JavaScript中设置断点并逐步执行。研究通过$(elemment).bind / click / focus / etc或从老式事件属性(例如onclick =“” / onfocus =“”等)完成的事件处理程序。

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

固定下来会有些困难。您将需要转到“脚本”选项卡,并开始向在负载下运行的每个脚本添加断点。通过单击JavaScript行的左侧来执行此操作。

重新加载页面,您的断点将阻止浏览器加载页面。在脚本面板上按“继续”按钮。转到您的网络面板,查看是否已发出您的请求,继续直至找到该请求。您可以通过缓慢添加越来越多的断点,然后逐步进入和退出函数,来缩小请求的范围。

您在代码中寻找什么

与以下内容类似:

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

var url = workingUrl + someObject.someProperty;

请记住,someObject可能是object {},array[]或任何内部浏览器类型。关键是要访问的属性不存在。

我看不到任何404 /红色请求

然后,无论是什么原因引起的,都不会由您的测试触发。尝试使用更多的东西。关键是您应该能够使请求以某种方式发生。你还不知道。它必须显示在“网络”面板中。唯一不会发生的事情是什么时候您都没有做任何事情触发它。

结论

没有超级简单的方法来确定到底发生了什么。但是,使用我概述的方法,您至少应该能够接近。您甚至可能根本没有考虑过。


1
感谢您的答复。我已经尝试过使用Firebug进行检查,并通过在IP上观看我的清漆/ Apache日志来进行检查,但是没有成功。这些“未定义”请求占所有html请求的不到1%,并且涉及所有类型的页面,因此触发它们确实非常困难。但是下周,我将使用不同的浏览器再试一次,并且将更深入地调查像您所说的事件处理程序。谢谢!
colinux 2012年

我敢打赌,它更有可能像一样var url = omeObject['usuallyAURL'];,并且已被设置为某些请求资产的src或href,因此被视为相对路径请求。即<img src="undefined" />
Yahel 2012年

17

根据这篇文章,我对“ Complitly” Chrome插件/恶意软件进行了反向工程,发现该扩展程序注入了“改进的自动完成”功能,该功能在具有NAME或输入文本字段的每个站点上引发“未定义”请求“搜索”,“ q”等的ID。

我还发现enable.js文件(完全是其中之一)正在检查一个名为“ suggestmeyes_loaded”的全局变量,以查看其是否已加载(例如Singleton)。因此,将此变量设置为false将禁用插件。

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

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

该恶意软件还会将您的用户重定向到“ searchcompletion.com”网站,有时会显示竞争对手的ADS。因此,应该认真对待。


我也在日志中看到了这种情况,页面不可能是JS。我相信您是100%正确的。尽管我想知道恶意软件更改此变量的名称需要多长时间。
劳伦斯多尔

在我看来,这听起来很合理。一个例外:请求的网址:/ ForSale / beach_front_property / bronx / undefined /用户代理:Mozilla / 5.0(兼容; Googlebot / 2.1; + google.com/bot.html)不确定Googlebot为何会找到并遵循它。除非他们在某处检测到URL并去看看。但该漫游器指出了正确的引荐来源网址
克里斯·萨廷格

另一个例外:用户代理:Opera / 9.80(Windows NT 5.1)Presto / 2.12.388版本/12.16对于Opera也完全不可用。我看到很多Linux,Android和NT
Chris Sattinger

@felix Googlebot知道URL的一个地方是当浏览器“打电话回家”时从Chrome用户那里获得的信息
Izkata

8

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

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

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

一旦确认了这样的标题,就可以将问题缩小到仅图像。不过,找到根本原因可能会花费一些时间:)

更新资料

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

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

您是对的,多亏了标题,我可以取得领先。当它是Chrome请求时,标头是(很抱歉注释中的格式错误),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 [...] 但是对于IE9,Accept标头引用了图像:Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 下周,我将花一些时间在图像方面进行研究。谢谢!
colinux 2012年

@colinux我已经更新了答案,以帮助您更轻松地发现问题。让我知道您在应用时是否有任何问题。
杰克

3

已经建立了一些事实,尤其是在以下线程中:http : //productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

它发生在根本没有JavaScript的页面上。这证明这不是页面编程错误

用户不知道该问题,并继续愉快地浏览。

有人访问该页面后几秒钟就会发生这种情况。

并不是每个人都这样。

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

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

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

我在链接后使用googlebot并声称拥有相同推荐人的情况。他们可能只是想变得聪明一点,然后浏览器将其传达给母舰,然后母舰就设置了一个机器人进行调查。

我对此建议深信,它是由插件引起的。完全是其中之一,但是不支持Opera。还有很多。

尽管移动浏览器不利于插件理论。

系统管理员报告说,通过在页面上添加一些JavaScript来欺骗Complitly认为它已初始化,这是一个重大的失败。

这是我对nginx的解决方案:

location ~ undefined/?$  {
  return 204;
}

这将返回“是的,但是您没有内容”。

如果您在website.com/some/page上,并且(以某种方式)导航至website.com/some/page/undefined,则浏览器将显示URL更改,但不会重新加载页面。前一页将保留在窗口中。

如果由于某种原因,这是用户所经历的,那么他们将获得干净的noop体验,并且不会打扰他们在做什么。


您的解决方案无疑使我摆脱了这一后果。浏览器抱怨混合内容(ssl和纯内容),现在已解决,谢谢。
莫里茨2014年

2

这听起来像是一种竞争条件,其中变量在使用之前未得到正确的初始化。根据您的评论,考虑到这不是AJAX问题,下面列出了几种解决方法。

连接Javascript异常记录器:这将帮助您捕获日志中几乎所有随机的Javascript异常。在大多数情况下,程序错误都会在这里冒出来。将其放在任何脚本之前。您将需要在服务器上捕获这些文件,并将它们打印到日志中以供以后分析。这是您的第一道防线。这是一个例子:

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

搜索window.location:对于这些实例中的每一个,您都应该向window.location添加日志记录或检查未定义的concats / appender。例如:

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

希望这会有所帮助。调试愉快。


1

我想知道这是否可能是adblocker问题。当我按IP地址搜索日志时,似乎是特定用户对/folder/page.html的每个请求都跟着对/ folder / undefined的请求


我认为这也与客户端上的软件有关。根据最近的日志,这仅适用于特定的IP地址,并且似乎也始终如此。我在用户代理字符串中看到BTRS123368和AskTbORJ / 5.15.2.23037,也许与其中之一有关。
Jorrit Schippers 2013年

我得到了更多结果:用户代理中具有FunWebProducts的人也正在请求/ undefined URL。
Jorrit Schippers

0

我不知道这是否有帮助,但是在多个浏览器中加载后,我的网站正在用undefined替换一个特定的* .webp图像文件。您的网站托管webp图像吗?


0

我遇到了类似的问题(但/null控制台中出现404错误),@ andrew-martinez的回答帮助我解决了这个问题。

原来我正在使用img带有空src字段的标签:

<img src="" alt="My image" data-src="/images/my-image.jpg">

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.