题 当我从ASP.NET MVC提供文件时,为什么Chrome会搜索我的favicon.ico?


我在MVC中有一个控制器,用于提供数据库中的图像。

编辑: 如果我在MVC中通过完全标准的方式提供文件,这仍然会发生。

每当我请求我的图片时,Google Chrome也会搜索我的favicon.ico。

为了避免对其他事情进行不必要的讨论“我也应该关心”让我们假设我不关心在这个例子中的任何缓存,我将始终返回带有该文件的HTTP响应200。

在我的控制器中,我返回以下内容:

return File(fileBytes, contentType);

检查Fiddler 2后,会生成以下响应:

HTTP / 1.1 200好的
  缓存控制:公共
  内容类型:image / gif
  ETag:oYu19wKo + KEHkyxZQ2WXAA ==
  服务器:Microsoft-IIS / 7.0
  X-AspNetMvc-Version:1.0
  X-AspNet-Version:2.0.50727
  X-Powered-By:ASP.NET
  日期:2009年6月16日星期二18:48:45 GMT
  内容长度:29344

相比之下,当我(首次)请求Google徽标时,这是来自Google的Fiddler的回复:

HTTP / 1.1 200好的
  内容类型:image / gif
  最后修改日期:2006年6月7日星期三19:42:34 GMT
  日期:2009年6月16日星期二18:50:54 GMT
  到期日:2010年6月16日星期三18:50:54 GMT
  Cache-Control:public,max-age = 31536000
  服务器:gws
  内容长度:8706
  年龄:2岁

但是,在获取我的图片后Chrome浏览器会尝试找到我的favicon.ico。确实如此  请求Google徽标后尝试此操作。

任何想法为什么会这样?根据我对HTML的理解,答案必须在响应头中,因为肯定这是客户端必须继续进行的所有操作?请指正!

编辑2: 似乎很多人完全误解了这个问题。 问题是  在MVC中缺少favicon和错误请求 - 这是在仅加载图像时请求图标的问题,内容类型为“IMAGE / JPEG”,而不是内容类型为“TEXT”的网页/ HTML“!


12
2018-06-16 19:00


起源


如果你返回一个像“Hello World”这样的简单字符串而不是文件,会发生同样的事吗? - Joseph
我建议你在问题中添加“iis”“google-chrome”和“http-headers”标签,以便将注意力转移到MVC上。从其他站点提取静态图像时的行为是什么(asp.net 例如)? - Peter Seale
这篇文章很老了,但它出现在谷歌搜索中,我仍然看到这种行为。我在我的服务器上拖尾我的错误日志,每次我请求带有chrome的页面时,我确实看到了 file does not exist: /path/favicon.ico。绝对是铬的东西,有点烦人。 - thefoyer


答案:


这与MVC无关。我正在使用带有自定义构建的日志服务的webforms,我偶然发现这个帖子,想知道为什么我的日志中存在连续的“文件不存在”错误。这是我的开发机器本地,我的项目中没有favicon.ico文件,我已经尝试过IE,Firefox和Google试图查看哪个浏览器是有罪的一方。

Google Chrome浏览器向我的应用发出的每个请求都会请求favicon.ico。我必须在本地开始记录浏览器,以确定它实际上是googles浏览器,这是罪魁祸首。如果它困扰你我会联系谷歌。我只是想确保它不是一些感染我的chrome的新木马。


7
2017-07-13 12:50



确实是Chrome中的一个错误,最近已修复:crbug.com/39402#c47请参阅 我更新的答案 下面。 - Noyo


你有一个图标吗?如果没有,也许这就是Chrome每次为您的网站尝试找到它的原因。对于谷歌它已经有缓存的favicon。


4
2018-06-16 19:29



其实我刚检查过这个。我在那里插了一个空白的favicon.ico,但它重复了这个请求。 - joshcomley
“空白”是否意味着零大小? - Alexander Prokofyev
是的,我刚刚制作了一个空的favicon.ico来测试它 - joshcomley
也许尝试在Chrome中实际显示一个真正的16x16px图标。否则它可能只是丢弃它。 - Vilx-
我也会测试真实的图标文件。 - Alexander Prokofyev


实际答案:这是一个已知的,经过验证的错误。 *(最近修好了!...也许?)

看起来Chrome是一个众所周知的长期问题: http://crbug.com/39402

如果你想早点修复它,那就明白这个问题吧。发表此问题的更多人可能会提高其优先级,并可能更快地修复它。


****更新1 ***:截至今年5月15日(2013年) - 在提出此问题四年后 - 看起来问题已在第29版修复: http://crbug.com/39402#c47

随意撤消所有黑客和变通方法。 :]

****更新2(2015-01)***:根据相同的问题链接,这显然仍是一些用户的问题。 :/


4
2018-04-20 19:54



2016年仍然在Chrome中找到“404 Not Found”。 - usefulBee


您可以做的一件事是让MVC忽略任何* .ico请求,以便在调试时不会出现任何异常。

应该是这样的:

routes.MapRoute("ignore-favicon", "{*path}", null, new {path = ".*/favicon\\.ico"});

该URL模式匹配所有内容,但随后我们将其约​​束为仅匹配以favicon.ico结尾的任何内容。 (我没有测试过这个)


3
2018-06-17 06:25



现在有一些人建议 - 我不希望它忽略favicon请求!我想知道为什么在我刚刚直接加载图像时首先要求提出请求。 - joshcomley
您应该与浏览器供应商联系。这是发出请求的浏览器。 - Haacked
实际上是一个IgnoreRoute。 - Daniel A. White


我不久前遇到了这个问题,并通过添加忽略特定路线来绕过它

routes.IgnoreRoute("{*favicon}", new { favicon = ".*/favicon\\.ico" });

进入Global.asax中的RegisterRoutes方法。


2
2018-06-17 06:29





对我来说,Chrome会为自己的标签请求一个favicon - 我一直得到404s(因为我的favicon在其他地方而且我的网页知道它),直到我做了一些测试并意识到Chrome是对favicon文件的直接请求。没有真正的解决方案,除了重写真实文件我猜


1
2017-12-06 03:38





你可以在你的内容中添加这样的东西 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>

你可以/应该为任何images / .js和css文件做同样的事情


1
2017-12-14 13:46