javascript 自2012年6月12日以来,在我的网站上随机添加了1%的请求URL“未定义”

yqlxgs2m  于 2022-12-28  发布在  Java
关注(0)|答案(8)|浏览(115)

自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)。
在座有没有人注意到同样的问题,或者有更完整的解释?

suzh9iv8

suzh9iv81#

没有简单直接的答案。
你将不得不对此进行调试,由于URL中的"未定义"一词,它可能是JavaScript。然而,它不一定是AJAX,它可以是JavaScript,创建任何由浏览器自动解析的URL(例如,在图像标签上设置src属性、设置css-image属性等的JavaScript)。我使用的Firefox大多数时候都安装了Firebug,所以我的指示会考虑到这一点。

    • Firebug初始设置**
  • 如果您已经知道如何使用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行。
重新加载您的页面,您的断点应该会阻止浏览器加载该页面。请按脚本面板上的"继续"按钮。转到网络面板,查看您的请求是否已发出,继续操作直到找到为止。您可以使用此功能,通过慢慢添加越来越多的断点,然后逐步进入和退出函数,来缩小发出请求的位置。

    • 在代码中查找的内容**

类似于以下内容的事物:

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

var url = workingUrl + someObject.someProperty;

记住someObject可能是一个对象{}、一个数组[]或任何内部浏览器类型,关键是将访问一个不存在的属性。

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

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

    • 结论**

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

ghg1uchk

ghg1uchk2#

基于这个post,我逆向工程“Complitly”Chrome插件/恶意软件,发现这个扩展注入了一个“改进的自动完成”功能,该功能在每个具有名称或ID为“搜索”,“q”和许多其他输入文本字段的网站上抛出“未定义”请求。
我还发现enable.js文件(编译文件之一)正在检查一个名为“suggestmeyes_loaded”的全局变量,以查看它是否已经加载(就像Singleton一样)。
要禁用恶意软件并停止“未定义”的请求,请将此应用到您网站上具有搜索字段的每个页面:

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

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

os8fio9y

os8fio9y3#

您已经正确地确定undefined与JavaScript问题有关,如果您的站点用户没有抱怨看到错误页面,您可以检查以下内容。
如果使用JavaScript设置或更改图像位置,有时会发生undefined进入URI的情况。
当这种情况发生时,浏览器会很乐意尝试加载图像(没有AJAX头),但会留下提示:它设置特定的Accept:报头;它将使用image/jpeg, image/png, ...来代替text/html, text/xml, ...
一旦确认了这样的标题,你就把问题缩小到了图像范围。不过,找到根本原因可能需要一些时间:)

    • 更新**

为了帮助调试,你可以重写$.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));
5lhxktic

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解决方案:

location ~ undefined/?$  {
  return 204;
}

这将返回“是的,可以,但没有适合您的内容”。
如果你在www.example.com上website.com/some/page,你(以某种方式)导航到website.com/some/page/undefined,浏览器会显示修改后的URL,但甚至不会重新加载页面。
如果出于某种原因,这是用户所经历的事情,那么他们将有一个干净的noop体验,它不会打扰他们正在做的任何事情。

fquxozlt

fquxozlt5#

这听起来像是一个竞态条件,即变量在使用前没有得到正确的初始化。根据您的评论,考虑到这不是一个 AJAX 问题,将有几种方法来解决这个问题,如下所列。

连接Javascript异常记录器:这将帮助你捕获日志中所有随机的javascript异常。2大多数时候程序错误会在这里冒出来。3把它放在任何脚本之前。4你需要在服务器上捕获这些异常,并把它们打印到你的日志中以便以后分析。5这是你的第一道防线。6下面是一个例子:

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中添加日志记录或检查未定义的concat/appender。2例如:

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

希望这对你有帮助。调试愉快。

rks48beu

rks48beu6#

我想知道这是否是广告拦截程序的问题。当我按IP地址搜索日志时,发现每个特定用户对/folder/page. html的请求后都有一个对/folder/undefined的请求

6ss1mwsb

6ss1mwsb7#

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

7ivaypg9

7ivaypg98#

我也遇到过类似的问题(但是控制台中有/null 404错误),@andrew-martinez的回答帮助我解决了这个问题。
原来我使用的是img标签和一个空的src字段:
<img src="" alt="My image" data-src="/images/my-image.jpg">
我的想法是通过javascript设置data-src属性中的src属性(延迟加载)来防止浏览器在页面加载时加载图像,以便稍后手动加载。但当与iDangerous Swiper结合使用时,该方法导致了错误。

相关问题