ASP.NET MVC からファイルを提供するときに Chrome が私の favicon.ico を検索するのはなぜですか?
-
05-07-2019 - |
質問
MVC にデータベースから画像を提供するコントローラーがあります。
編集: MVC で完全に標準的な方法でファイルを提供すると、この問題が依然として発生します。
画像をリクエストするたびに、Google Chrome は私の favicon.ico も検索します。
他の「考慮すべきこと」についての不必要な議論を避けるために、この例ではキャッシュについてはまったく考慮せず、ファイルとともに常に HTTP 応答 200 を返すものとします。
私のコントローラーでは次を返します。
return File(fileBytes, contentType);
Fiddler 2 を検査すると、次の応答が生成されます。
HTTP/1.1 200 OK
キャッシュ制御:公共
コンテンツタイプ:画像/GIF
Eタグ:oYu19wKo+KEHkyxZQ2WXAA==
サーバ:Microsoft-IIS/7.0
X-AspNetMvc-バージョン:1.0
X-AspNet-バージョン:2.0.50727
X パワードバイ:ASP.NET
日付:2009 年 6 月 16 日火曜日 18:48:45 GMT
コンテンツの長さ:29344
比較すると、これは、(初めて) Google ロゴをリクエストしたときの、Google からの Fiddler での応答です。
HTTP/1.1 200 OK
コンテンツタイプ:画像/GIF
最終更新日:2006 年 6 月 7 日水曜日 19:42:34 GMT
日付:2009 年 6 月 16 日火曜日 18:50:54 GMT
有効期限:2010 年 6 月 16 日水曜日 18:50:54 GMT
キャッシュ制御:パブリック、max-age=31536000
サーバ:GW
コンテンツの長さ:8706
年:2
ただし、Chrome では、画像を取得した後、favicon.ico を見つけようとします。します ない Google ロゴをリクエストした後、これを試してください。
なぜこれが起こっているのか考えられますか?HTML に関する私の理解では、クライアントが続行しなければならないのはそれだけなので、応答ヘッダーに答えがあるはずです。訂正してください!
編集2: 多くの人がこの問題を完全に誤解しているようです。 問題は ない MVC でのファビコンの欠如とリクエストのエラー - コンテンツ タイプが「TEXT」の Web ページではなく、コンテンツ タイプが「IMAGE/JPEG」の画像のみがロードされているときにファビコンをリクエストするという問題です。 /HTML」!!
解決
これはMVCとは関係ありません。私はカスタムビルドされたログサービスでウェブフォームを使用していますが、なぜこのログに「ファイルが存在しません」というエラーが連続して表示されるのか疑問に思いました。これは私の開発マシンにローカルにあり、プロジェクトにfavicon.icoファイルがありません。IE、Firefox、Googleがどのブラウザーが有罪かを確認しようとしました。
Google Chromeからアプリへのすべてのリクエストは、favicon.icoをリクエストします。ブラウザーのログをローカルで開始して、実際にgooglesブラウザーが原因であると判断する必要がありました。気になる場合はGoogleに連絡します。クロームに感染する新しいトロイの木馬ではないことを確認したかっただけです。
他のヒント
実際の答え:これは既知の検証済みのバグです。 *(最近修正されました......たぶん?)
Chromeに関する既知の長年の問題のように見えます: http://crbug.com/39402
より早く修正する場合は、問題にスターを付けます。この問題に主演する人が増えると、優先度が上がり、おそらくより早く修正されるでしょう。
**** UPDATE 1 ***:今年(2013年)5月15日-この質問が出されてから4年後-バージョン29で問題が修正されたようです: http://crbug.com/39402#c47
ハックや回避策をすべて元に戻してください。 :]
**** UPDATE 2(2015-01)***:同じ問題のリンクによると、これは明らかに一部のユーザーにとってはまだ問題です。 :/
ファビコンはありますか?そうでない場合、Chromeがあなたのウェブサイトで毎回見つけようとするのはそのためでしょう。グーグルの場合、すでにファビコンがキャッシュされています。
できることの1つは、デバッグ中に例外が発生しないように、MVCに* .icoの要求を無視させることです。
次のようになります。
routes.MapRoute("ignore-favicon", "{*path}", null, new {path = ".*/favicon\\.ico"});
このURLパターンはすべてに一致しますが、favicon.icoで終わるものにのみ一致するように制限します。 (私はこれをテストしていません)
しばらく前にこの問題に遭遇し、追加して特定のルートを無視することで回避しました
routes.IgnoreRoute("{*favicon}", new { favicon = ".*/favicon\\.ico" });
Global.asaxのRegisterRoutesメソッドへ。
Chromeが独自のタブのファビコンを要求しているようです-いくつかのテストを行い、Chromeがファビコンに直接リクエストを行っていることに気付くまで、404を取得し続けました(私のファビコンは他の場所にあり、ページがそれを知っているため)ファイル。私が推測する実際のファイルを書き換える以外は、本当の修正はありません
web.config
ファイル内にこのような何かを追加して、 favicon.ico
がクライアントにキャッシュされ、毎回要求されないようにすることができます。
<location path="favicon.ico">
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="public, max-age=31536000" />
</customHeaders>
</httpProtocol>
</system.webServer>
</location>
画像/ .jsおよびcssファイルについても同じことができます/すべきです
Expiresヘッダーを設定して、ブラウザにローカルコピーを使用する期間を指示する必要があります。
プロジェクトの設定を確認すると、デフォルトアイコンがどこかに表示されます。削除しますか?
Chromeブラウザーは他のサイトとは別の方法でGoogleサイトで動作する可能性があるため、最初は、StackOverflowなど、どこか他の場所でfavicon.icoを探すかどうかを確認することをお勧めします。
Firefoxがあなたのサイトでも同じことをするかどうかを確認します。 favicon.icoは、サイトに存在しなくても、ブラウザの実行ごとに1回だけ要求されるべきだと思います。これは、使用しているChromeバージョンのバグである可能性があります。
これ SO の質問と回答では、ルートを使用してブラウザーにファビコンを提供する方法について説明しています。
マスターページにICONリンクを入力することが重要です。そうしないと、一部のブラウザーは、一度だけグローバルにではなく、すべてのディレクトリのfavicon.icoを見つけようとします。
<link rel="SHORTCUT ICON" href="<%= Url.Content("~/content/images/rr-favicon.ico") %>"/>
Googleツールバーは、私のログ(そしてもちろんIE6)から判断すると、有罪のようです。両方とも、ルート以外のディレクトリをリクエストします
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; GoogleToolbar 6.2.1910.1554; Windows 6.0; MSIE 8.0.6001.18828)