Javascript &引用;“未定义”;自2012年6月12日起,在我的网站上随机添加1%的请求URL

Javascript &引用;“未定义”;自2012年6月12日起,在我的网站上随机添加1%的请求URL,javascript,browser,Javascript,Browser,自2012年6月12日11:20TU以来,我在varnish/apache日志中看到了非常奇怪的错误 有时,当用户请求一个页面时,几秒钟后我会看到一个类似的请求,但是url中最后一个/之后的所有字符串都被替换为“undefined” 例如: 触发请求 当然,这些“未定义”页面并不存在,而是返回我的404页面(这是一个具有标准布局的自定义页面,而不是经典的Apache404) 任何页面(从主页到最深处)都会发生这种情况 使用各种浏览器(主要是Chrome19,也有Firefox3.5到12,即8

自2012年6月12日11:20TU以来,我在varnish/apache日志中看到了非常奇怪的错误

有时,当用户请求一个页面时,几秒钟后我会看到一个类似的请求,但是url中最后一个/之后的所有字符串都被替换为“undefined”

例如: 触发请求

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

  • 任何页面(从主页到最深处)都会发生这种情况
  • 使用各种浏览器(主要是Chrome19,也有Firefox3.5到12,即8/9…),但只占流量的1%
  • 这些请求发送的头是经典头(没有ajax头)
  • 对于给定的ip,这似乎是随机发生的:有时在访问的第一个页面,有时在访问期间在一个随机页面上,有时在访问期间在几个页面上
当然,这看起来像是一个javascript问题(我使用的是谷歌托管的jquery 1.7.2),但几天以来,我的js/html或服务器配置完全没有变化,我以前从未见过这种错误。当然,html中没有这样的链接

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

  • 未定义的请求永远不会作为其他页面的引用,而是“真实”页面被用作相同IP的以下请求的引用(用户可以使用404页面上的经典菜单)
  • 我在Google Analytics中没有看到这些页面的任何痕迹,所以我假设没有执行javascript(包括404在内的所有页面上都存在跟踪器)
  • 没有人就此联系过我们,即使我在该网站的社交网络中提到了这个问题
  • 之后大部分用户继续访问
所有这些事实让我觉得问题在浏览器中悄无声息地出现,可能是由错误的插件、防病毒软件、浏览器栏或昨天更新的浏览器中集成的蹩脚制造商软件触发的(但我昨天没有发现针对chrome、firefox和IE发布的任何插件)


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

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

如果使用JavaScript设置或更改图像位置,有时会出现
未定义的
进入URI的情况

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

一旦确认了这样一个标题,您就已经将问题缩小到仅限于图像。但是,找到根本原因可能需要一些时间:)

更新

为了帮助调试,您可以重写
$.fn.attr()
,并在将某些内容分配给未定义对象时调用调试器。大概是这样的:

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

没有简单直接的答案

您必须对此进行调试,这可能是由于URL中的“未定义”单词导致的JavaScript。但是,它不一定是AJAX,它可以是JavaScript,创建由浏览器自动解析的任何URL(例如,在图像标记上设置src属性的JavaScript、设置css图像属性等)。我大部分时间都使用安装的,所以我的说明会记住这一点

Firebug初始设置

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

安装并重新启动Firefox for Firebug后,您必须启用Firebug的大多数“面板”。要打开Firebug,浏览器右上角会有一个看起来像Firebug/昆虫的小东西,或者您可以按F12。单击Firebug选项卡“控制台”、“脚本”、“网络”,打开它们并读取面板信息以启用它们。您可能必须刷新页面才能使其正常工作

调试用户交互

导航到Firebug打开且网络面板处于活动状态时出现问题的页面之一。在网络面板中将有几个选项:“清除”、“持久化”、“全部”、“Html”等。请确保选择了“全部”。不要在页面上做任何事情,尽量不要将鼠标移到页面上的任何东西上。仔细检查请求。无效URL的请求将为红色,并且可能具有404 Not Found(或类似)的状态

看到了吗?跳到下一部分

在初始加载时没有看到它?开始使用您的页面并在此处继续

开始点击每一项功能,鼠标悬停在所有东西上,等等。注意网络面板,观察失败的请求。您可能必须具有创造性,但请继续使用应用程序,直到您的浏览器发出无效请求。如果页面发出许多请求,请随意点击网络面板左上角的“清除”按钮,将其清除一点

如果您提交页面时看到一个失败的请求很快发出,但由于下一个页面加载而丢失,请单击网络面板左上角的“持久化”启用持久化

一旦这样做了,它应该考虑你所做的事情。看看你能不能让它再次发生。在您弄清楚是什么用户交互使其发生后,深入研究代码并开始查找发出无效请求的内容

您可以使用“脚本”选项卡在JavaScript中设置断点并逐步执行。调查通过$(elemment).bind/click/focus/etc或从onclick=“”/o等旧式事件属性完成的事件处理程序
var url = workingUrl + someObject['someProperty'];

var url = workingUrl + someObject.someProperty;
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);
};
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
} 
$("body").on("click", "a[href$='undefined']", function() {
    window.onerror('Bad link: ' + $(this).html()); //alert home base
});
location ~ undefined/?$  {
  return 204;
}