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

2024-05-15

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

有时,当用户请求一页时,几秒钟后我会看到类似的请求,但 url 中最后一个 / 之后的所有字符串已被“未定义”替换。

例子:http://example.com/foo/bar http://example.com/foo/bar触发一个http://example.com/foo/undefined 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)
  • 没有人就此事与我们联系,即使我在网站的社交网络中提到了这个问题
  • 大多数用户此后继续访问

所有这些事实让我认为问题在浏览器中悄然发生,可能是由有缺陷的附加组件、防病毒软件、浏览器栏或昨天更新的浏览器中集成的蹩脚制造商软件触发的(但我没有发现任何附加组件发布)昨天针对 chrome、firefox 和 IE)。

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


没有简单直接的答案。

您必须对此进行调试,由于 URL 中存在“未定义”一词,它可能是 JavaScript。然而,它不一定是 AJAX,它可以是 JavaScript 创建任何由浏览器自动解析的 URL(例如,在图像标签上设置 src 属性、设置 css-image 属性等的 JavaScript)。我用Firefox http://www.mozilla.org/en-US/firefox/new/ with Firebug http://www.mozilla.org/en-US/firefox/new/大部分时间都是安装的,所以我的指导会考虑到这一点。

Firebug 初始设置

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

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

调试用户交互

导航到存在 Firebug 打开且“网络”面板处于活动状态的问题的页面之一。在网络面板中会有几个选项:“清除”、“保留”、“全部”、“Html”等。确保选择全部。不要在页面上执行任何操作,也不要将鼠标悬停在页面上的任何内容上。查看请求。对无效 URL 的请求将显示为红色,并且状态可能为 404 Not Found(或类似)。

看到加载了吗?跳到下一部分。

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

开始单击每个功能,将鼠标悬停在所有内容上,等等。密切关注“网络”面板并注意失败的请求。您可能需要发挥创意,但请继续使用您的应用程序,直到您看到浏览器发出无效请求。如果页面发出很多请求,请随时点击网络面板左上角的“清除”按钮来清除它。

如果您提交页面并看到失败的请求很快消失,但由于下一页加载而丢失,请通过单击“网络”面板左上角的“持久”来启用持久性。

一旦发生了,而且应该考虑一下你做了什么来实现这一点。看看你能否让它再次发生。在弄清楚是什么用户交互导致了这种情况发生后,请深入研究该代码并开始查找发出无效请求的内容。

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

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

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

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

您在代码中寻找什么

类似于以下内容:

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

var url = workingUrl + someObject.someProperty;

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

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

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

结论

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自 2012 年 6 月 12 日以来,“未定义”随机附加在我网站上 1% 的请求网址中 的相关文章

随机推荐