80

2012 年 6 月 12 日 11:20 TU 以降、varnish/apache ログに非常に奇妙なエラーが表示されます。

ユーザーが 1 つのページをリクエストすると、数秒後に同様のリクエストが表示されることがありますが、URL の最後の / の後のすべての文字列が「未定義」に置き換えられています。

例: 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 アナリティクスでこれらのページの痕跡が見られなかったので、JavaScript が実行されていないと推測します (トラッカーは 404 を含むすべてのページに存在します)。
  • ウェブサイトのソーシャルネットワークで問題を提起したときでさえ、誰もこれについて私たちに連絡していません
  • ほとんどのユーザーはその後も訪問を続けます

これらすべての事実から、おそらくバグのあるアドオン、アンチウイルス、ブラウザバー、または昨日更新されたブラウザに統合された安っぽいメーカーのソフトウェアが原因で、問題がブラウザで静かに発生していると思われます(ただし、リリースされたアドオンは見つかりませんでした昨日、chrome、firefox、IE の場合)。

ここで同じ問題に気付いた人はいますか、それともより完全な説明がありますか?

4

8 に答える 8

21

簡単な答えはありません。

これをデバッグする必要があります。URLに「undefined」という単語が含まれているため、おそらくJavaScriptです。ただし、AJAXである必要はありません。ブラウザによって自動的に解決されるURLを作成するJavaScriptである可能性があります(たとえば、画像タグにsrc属性を設定するJavaScript、css-image属性を設定するJavaScriptなど)。私はほとんどの場合FirebugがインストールされたFirefoxを使用しているので、私の指示はそれを念頭に置いています。

Firebugの初期設定

Firebugの使用方法をすでに知っている場合は、これをスキップしてください。

Firefox for Firebugをインストールして再起動した後、Firebugの「パネル」のほとんどを有効にする必要があります。Firebugを開くには、ブラウザの右上隅に小さなFire Bug /昆虫のようなものが表示されるか、F12キーを押します。Firebugタブの「コンソール」、「スクリプト」、「ネット」をクリックし、それらを開いてパネルの情報を読んで有効にします。正しく機能させるには、ページを更新する必要がある場合があります。

ユーザーインタラクションのデバッグ

Firebugが開いていて、ネットパネルがアクティブであるという問題があるページの1つに移動します。ネットパネルには、「クリア」、「永続化」、「すべて」、「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/赤のリクエストが表示されません

その後、それを引き起こしているものは何でもあなたのテストによって引き起こされていません。もっとたくさん使ってみてください。重要なのは、なんとかしてリクエストを実行できるようにする必要があるということです。あなたはまだ知りません。ネットパネルに表示する必要があります。それが起こらないのは、それをトリガーするものを何もしていないときだけです。

結論

正確に何が起こっているのかを突き止める簡単な方法はありません。ただし、私が概説した方法を使用すると、少なくとも近づくことができるはずです。それはおそらくあなたが考えていないことです。

于 2012-06-20T21:32:56.390 に答える
17

この投稿に基づいて、「Complitly」Chrome プラグイン/マルウェアをリバース エンジニアリングしたところ、この拡張機能が「改善されたオートコンプリート」機能を挿入し、NAME または"search"、"q" などの ID。

また、enable.js ファイル (コンパイル済みファイルの 1 つ) が "suggestmeyes_loaded" というグローバル変数をチェックして、既にロードされているかどうかを確認していることもわかりました (Singleton のように)。したがって、この変数を false に設定すると、プラグインが無効になります。

マルウェアを無効にして「未定義」のリクエストを停止するには、サイトの検索フィールドを持つすべてのページにこれを適用します。

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

このマルウェアは、ユーザーを「searchcompletion.com」サイトにリダイレクトし、競合他社の ADS を表示することもあります。したがって、それは真剣に受け止められるべきです。

于 2013-01-05T17:34:00.977 に答える
8

が JavaScript の問題に関連していることを正しくundefined確認しました。サイトのユーザーがエラー ページの表示について不満を持っていない場合は、次の点を確認してください。

画像の場所を設定または変更するために JavaScript が使用されている場合、undefinedが URI に入り込むことがあります。

その場合、ブラウザーは喜んで画像をロードしようとしますが (AJAX ヘッダーなし)、ヒントが残ります。つまり、特定のAccept:ヘッダーを設定します。代わりにtext/html, text/xml, ...を使用しますimage/jpeg, image/png, ...

このようなヘッダーが確認されると、問題を画像のみに絞り込むことができます。ただし、根本的な原因を見つけるには時間がかかる可能性があります:)

アップデート

デバッグを支援するため$.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));
于 2012-06-20T09:23:34.753 に答える
3

特にこのスレッドで確立されたいくつかの事実: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

JavaScript がまったくないページで発生します。これは、オンページ プログラミング エラーではないことを証明します。

ユーザーは問題を認識しておらず、非常に満足してブラウジングを続けています。

ユーザーがページにアクセスしてから数秒後に発生します。

それはすべての人に起こるわけではありません。

複数のブラウザー (Chrome、IE、Firefox、Mobile Safari、Opera) で発生する

複数のオペレーティング システム (Linux、Android、NT) で発生します。

複数の Web サーバー (IIS、Nginx、Apache) で発生します。

リンクをたどって同じリファラーを主張するグーグルボットのケースが1つあります。彼らは単に賢くしようとしているだけかもしれません。ブラウザはそれをマザーシップに伝え、マザーシップは調査のためにボットを設定しました。

プラグインが原因であるという提案にはかなり納得しています。Complitly は 1 つですが、それは Opera をサポートしていません。他にもたくさんあります。

ただし、モバイル ブラウザーはプラグイン理論に反するものです。

システム管理者は、ページに JavaScript を追加して、Complitly をだまして既に初期化されていると思わせることにより、大幅な低下を報告しています。

nginxの私のソリューションは次のとおりです。

location ~ undefined/?$  {
  return 204;
}

これは、「はい、大丈夫ですが、コンテンツはありません」を返します。

website.com/some/page にいて、(どういうわけか) website.com/some/page/undefined に移動すると、ブラウザーは URL が変更されたものとして表示しますが、ページの再読み込みさえしません。前のページは、ウィンドウにあったままになります。

なんらかの理由でこれがユーザーに発生するものである場合、ユーザーはクリーンな noop エクスペリエンスを得ることができ、ユーザーが何をしていても邪魔されることはありません。

于 2013-10-20T13:12:47.343 に答える
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/appenders をチェックする必要があります。例えば:

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 リンク自体が残っているだけです。3 番目のステップは、無効な URL パターンの未処理の DOM リンクをすべてチェックすることです (jQuery の読み込みが完了した直後にこれをアタッチできます。早い段階でアタッチすることをお勧めします)。

$("body").on("click", "a[href$='undefined']", function() {
    window.onerror('Bad link: ' + $(this).html()); //alert home base
});

これが役に立てば幸いです。楽しいデバッグ。

于 2012-06-23T09:20:59.773 に答える
1

これはアドブロッカーの問題ではないかと思います。IP アドレスでログを検索すると、特定のユーザーによる /folder/page.html へのすべてのリクエストの後に /folder/undefined へのリクエストが続くように見えます

于 2012-09-14T16:16:46.510 に答える
0

/null@andrew-martinezの回答が解決に役立った同様の問題がありました(ただし、コンソールに404エラーがありました)。

img空のsrcフィールドを持つタグを使用していたことがわかりました:

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

私の考えは、ブラウザがページの読み込み時に画像をロードして後で手動でロードするのを防ぐことでした。しかし、iDangerous Swiper と組み合わせると、その方法でエラーが発生しました。

于 2015-11-05T13:59:42.650 に答える