当我从 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 好
缓存控制:民众
内容类型:图片/gif
电子标签:oYu19wKo+KEHkyxZQ2WXAA==
服务器:微软-IIS/7.0
X-AspNetMvc-版本:1.0
X-AspNet-版本:2.0.50727
X 供电者:网络平台
日期:2009 年 6 月 16 日星期二 18:48:45 GMT
内容长度:29344
相比之下,当我(第一次)请求 Google 徽标时,这是 Google 在 Fiddler 中的响应:
HTTP/1.1 200 好
内容类型:图片/gif
上一次更改:2006 年 6 月 7 日星期三 19:42:34 GMT
日期:2009 年 6 月 16 日星期二 18:50:54 GMT
到期时间:2010 年 6 月 16 日星期三 18:50:54 GMT
缓存控制:公开,最大年龄=31536000
服务器:GWS
内容长度:8706
年龄:2
但是,在 Chrome 中获取我的图像后,Chrome 会尝试找到我的 favicon.ico。确实如此 不是 请求 Google 徽标后尝试此操作。
任何想法为什么会发生这种情况?根据我对 HTML 的理解,答案必须在响应标头中,因为这肯定是客户端必须继续进行的全部操作吗?请纠正我!
编辑2: 看来很多人完全误解了这个问题。 问题是 不是 MVC 中缺少图标和错误请求 - 这是在仅加载内容类型为“IMAGE/JPEG”的图像时请求图标的问题,而不是内容类型为“TEXT”的网页/HTML”!!
解决方案
这与MVC无关。我正在使用带有自定义构建的日志服务的webforms,我偶然发现这个帖子,想知道为什么我的日志中存在连续的“文件不存在”错误。这是我的开发机器本地,我的项目中没有favicon.ico文件,我尝试过IE,Firefox和Google试图查看哪个浏览器是有罪的一方。
Google Chrome向我的应用发出的每个请求都会请求favicon.ico 。我必须在本地开始记录浏览器,以确定它实际上是googles浏览器,这是罪魁祸首。如果它困扰你我会联系谷歌。我只是想确保它不是一些感染我的chrome的新木马。
其他提示
实际答案:这是一个已知的,经过验证的错误。 *(最近修好了......也许?)
Chrome看起来像一个众所周知的长期问题: http://crbug.com/39402
如果你想早点修复它,请解决问题。发表此问题的更多人可能会提高其优先级,并可能更快地修复它。
****更新1 ***:截至今年5月15日(2013年) - 在提出此问题四年后 - 看起来问题已在第29版修复: http://crbug.com/39402#c47
随意撤消所有黑客和变通办法。 :
****更新2(2015-01)***:根据相同的问题链接,这对某些用户来说显然仍然是一个问题。 :/
您可以做的一件事是让 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会为自己的标签请求一个favicon - 我一直得到404s(因为我的favicon是其他地方,我的网页知道它),直到我做了一些测试并意识到Chrome是直接向favicon请求文件。没有真正的修复,除了重写真实的文件我猜
您可以在 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网站,因此,首先,我建议每次在其他地方查看是否找到favicon.ico,例如,在StackOverflow上。
我还会检查Firefox是否对您的网站做同样的事情。我认为,即使站点上没有浏览器,每个浏览器也应该只请求一次favicon.ico。这可能是您使用的Chrome版本中的错误。
这个问题/答案解释了如何为Favicon提供服务使用路由到浏览器。
将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)