サイトにファビコンを配置しませんでした-Chromeから二重のトラフィックを取得します

インターネットサイトの開発を始めて5年で初めて、非常に予期せぬ問題に遭遇しました。 突然、localhostで現在開発中の新しいサイトで、INSERTデータベースクエリを複製していることがわかりました。 フォームから1つのコメントを送信すると、2つのコメントがデータベースに挿入されます。 この問題がChrome、favicon.ico、およびModRewriteにどのように関連付けられているかわからない場合は、catにようこそ。



いいえ、これは目には二重ではありません



もちろん、最初に頭に浮かんだのは、スクリプトのどこかでデータベースへのクエリが「倍増」することでした。 たとえば、そのような「学校の間違い」:



$query = "INSERT INTO table VALUES(...)"; $result = mysqli->query($query); if ($result = mysqli->query($query)) { ... }
      
      





10万回チェック-いいえ。 すべてがコードで整然としています。 そのため、ブラウザは何らかの理由でデータを2回送信します。 セッション変数の増分と-はいで簡単なテストスクリプトを生成します! ブラウザーは、1ずつ増加する代わりに、変数の増加を2頑固に示します。 Chrome Safariの代わりに試します-そのような問題はありません。 次は、誤動作しているJavaScript、ブラウザ拡張機能の検索ですが、すべて無効です。 インターネットでの検索でも同様のアドバイスが得られました。 同様の状況にある多くのプログラマーは、一意性のチェックを導入し、重複した投稿をカットしました。 しかし、この解決策ではバグが修正されないため、停止せずにこの動作の理由を特定することにしました。



最後に、理由が見つかりました。 そして、私は英語の開発ブランチで解決策を見つけられなかったので、ここでそれを共有したいと思います。 すべてが単純です-2つの原因があります:Google Chrome(およびそのブラウザー)とApacheのmod_rewrite。



問題の本質



すべてがシンプルです。 Cromeプラットフォーム上に構築されたブラウザの機能は、各サイトのfavicon.icoファイルを検索することです。 彼がそうでない場合、彼らはすべて同じように彼を探し続けます。 ページが更新されるたびに、サーバーへの個別の要求。 また、Apacheのほとんどの.htaccessファイルには次の行があります。



 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /index.php
      
      





このルールに従って、ブラウザから存在しないfavicon.ico Apacheへのリクエストを受信すると、それを素直にindex.phpファイルにリダイレクトし、スクリプトが2回実行されます。 もちろん、ほとんどの場合、本格的なWebアプリケーションは一意性がチェックされ、繰り返し要求を逃しません。 ほとんどの場合、サイトにはfavicon.icoファイルがあります。 それでも、このような問題があるため、解決方法を説明できることを意味します。



ソリューションオプション



解決策は最初の、最も簡単なものです:favicon.icoで始めましょう。 Chromeはそれを見つけて落ち着きます。

2番目の解決策は、サーバー上の.htaccessファイルをわずかに変更することです。 すべてのプロジェクトのmod_rewriteルールブロックは、次のようになります。



 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f # Next line is to solve the Chrome and favicon.ico file issue. # Without it browser sends two requests to script. RewriteCond %{REQUEST_FILENAME} !favicon.ico # RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
      
      





ファビコンを入れていませんか? Chromeから二重トラフィックを取得



考えてみると、ステートメントはtrueです。なぜなら、サーバーは「静的」ではなく、Webアプリケーションを起動するからです。Webアプリケーションは、アイコンではなく動的に生成された404ページをブラウザーに返します。 そして最悪の場合、サイトのメインページが完全に起動します。 サイトにアイコンをインストールすることなく(たとえば、人気のあるブログエンジンに)、開発者はGoogle Chromeのユーザーからサーバーへの負荷を2倍にします。



それだけです。 この情報が誰かに役立ち、時間を節約できることを願っています。



All Articles