在ASP.NET MVC中提供favicon.ico


255

关于如何在ASP.NET MVC中提供favicon.ico的最终/最佳建议是什么?

我目前正在执行以下操作:

  • 在我的RegisterRoutes方法的开头添加一个条目:

    routes.IgnoreRoute("favicon.ico");
  • 将favicon.ico放在我的应用程序的根目录中(这也将是我的域的根目录)。

我有两个问题:

  • 除了我的应用程序的根目录之外,没有其他方法可以将favicon.ico放置在其他位置。与Contentand 处于同一级别,这非常令人讨厌Controllers
  • 这个IgnoreRoute("favicon.ico")陈述是否足够?或者我也应该按照Phil Haack的博客文章中的说明进行以下操作。我不知道从未在根目录以外的任何目录中看到过对favicon.ico的请求-这将使此操作变得不必要(但很高兴知道如何做)。

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

4
您的正则表达式应为“ \”。用于favicon.ico中的点,而不仅仅是“。”。
NathanAldenSr 2012年

1
这就是我使用的(考虑@NathanAldenSr的建议,支持正斜杠和反斜杠,还允许使用favicon.png文件):routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*[/\\])?favicon\.((ico)|(png))(/.*)?" });
BrainSlugs83 2015年

@ BrainSlugs83-您的解决方案为我添加了缺失的部分,即斜线...这里是.NET vNext版本(beta-5)。 routes.MapRoute("IgnoreFavicon", "{*favicon}", new { favicon = @"(.*[/\\])?favicon\.((ico)|(png))(/.*)?" });
Rentering.com 2013年

更正,vNext忽略路线routes.MapRoute("Ingore", "{*favicon}", new { }, new { favicon = @"(.*[/\\])?favicon\.((ico)|(png))(/.*)?" }); 通知thewnew {}
Rentering.com

Answers:


204

将favicon.ico放在您域的根目录中只会真正影响IE5,IIRC。对于更现代的浏览器,您应该能够包含一个链接标记以指向另一个目录:

<link rel="SHORTCUT ICON" href="http://www.mydomain.com/content/favicon.ico"/>

您还可以将非ico文件用于IE以外的浏览器,为此,我可能会使用以下条件语句将PNG提供给FF等,并将ICO提供给IE:

<link rel="icon" type="image/png" href="http://www.mydomain.com/content/favicon.png" />
<!--[if IE]>
<link rel="shortcut icon" href="http://www.mydomain.com/content/favicon.ico" type="image/vnd.microsoft.icon" />
<![endif]-->

25
您需要使用@ Url.Content生成链接,以便它可在所有环境中使用。看到AlexC的回应
RickAndMSFT'3的

5
是的,对于ASP.NET。我的回答说明了“通用”版本(纯HTML),因此任何人都可以对其进行修改以适合他们选择的框架/语言:)
Chris

重要的是要注意IE10不支持条件注释,因此这不适用于使用该浏览器的用户。一种解决方案是将您的收藏夹图标添加到站点的根目录,如果IE10在任何地方都找不到收藏夹图标的链接,则IE10会自动提取该收藏夹。
凯文·巴布科克2013年

2
IE11理解PNG图标,不需要条件语句。您应该看到这篇好文章:jonathantneal.com/blog/understand-the-favicon
QMaster 2014年

谢谢老兄!底部确实可以帮助我使用png,它只需要位于页面,主页或布局的顶部。
Alper

226

我同意Chris的回答,但是看到这是一个特定的ASP.NET MVC问题,最好使用两种Razor语法:

<link rel="icon" href="@Url.Content("~/content/favicon.ico")"/>

或传统上

<link rel="icon" href="<%= Url.Content("~/content/favicon.ico") %>"/>

而不是

<link rel="icon" href="http://www.mydomain.com/content/favicon.ico"/>

3
真正。我的回答是说明“通用”版本(HTML),因此任何人都可以进行修改以适合他们选择的框架/语言:)
Chris

2
@Diego-是的,rel =“ SHORTCUT ICON”是Internet Explorer使用的非标准实现。空格是W3C标准中的分隔符(请参阅developer.mozilla.org/en-US/docs/Web/HTML/Element/link)。在Internet Explorer以外的浏览器中,正确的语法是<link rel =“ icon” href =“ path / to / favicon.ico”>- 有关更多信息,请参见jonathantneal.com/blog/understand-the-favicon。显然,您可以使用Razor或Web Forms语法为上述图标提供路径。
pwdst

3
使用MVC 4,在这种情况下您将不需要Url.Content,因为它将自动处理,您可以使用;<link rel =“ icon” href =“〜/ content / favicon.ico” />
斯图尔特·万圣节

20

1)您可以将收藏夹放置在所需的位置,然后将此标签添加到页面标题

<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />

尽管某些浏览器默认会尝试从/favicon.ico获取该图标,所以您应该使用IgnoreRoute。

2)如果浏览器在另一个目录中请求网站图标,则会出现404错误,如果您在母版页的答案1中具有链接标记,浏览器将获取您想要的网站图标。


2
如果您将站点添加为书签,浏览器将查找.ico文件-这样做无济于事。但我想知道浏览器是否还记得这一点。我只知道在Fiddler中有时会看到一大堆图标被检索。也许那是谷歌工具栏吗?
Simon_Weaver

我认为您是对的,书签图标有时只能工作,但我从未弄清楚为什么,也许是这种情况
EduardoCampañó09年

7

我认为favicon.ico应该在根文件夹中。它只是属于那里。

如果要处理不同的图标,请将其放入控制器。你可以做到的。如果不是,请将其保留在根文件夹中。


1
我同意。它在根文件夹中,并且不应在其他任何地方...如果该图标在根文件夹中,则不需要HTML标签。适用于所有常见的浏览器...
Vinz 2015年

刚开始时,这对我来说似乎绝对是牛,但显然没有办法解决,我们的日志记录不断显示来自不同用户代理的404错误。
Michiel Cornille

3

以上都不对我有用。我终于通过将favicon.ico重命名为myicon.ico并在头部引用了它来解决了这个问题。<link rel="icon" href="~/myicon.ico" type="image/x-icon" />


2

还应该可以创建一个返回ico文件的控制器,并注册路由/favicon.ico指向该控制器。


2

您需要做的就是添加app.UseStaticFiles();startup.cs-> public void Configure(IApplicationBuilder app, IHostingEnvironment env)

ASP.net核心提供了一种获取静态文件的绝佳方法。那是使用wwwroot文件夹。请阅读ASP.NET Core中的静态文件

使用<Link />并不是一个好主意。为什么有人会在每个HTML或cshtml上为favicon.ico添加链接标记?


0

使用它而不是仅倾向于搜索fav图标文件的favicon.ico

> <link rel="ICON" 
> href="@System.IO.Path.Combine(Request.PhysicalApplicationPath,
> "favicon.ico")" />

使用所请求的路径并与fav图标文件结合使用,以便它获取其搜索的准确地址

使用此方法解决了Fav.icon错误,该错误始终在Application_Error上引发


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.