Обслуживание favicon.ico в ASP.NET MVC

228

Какова конечная/лучшая рекомендация по использованию favicon.ico в ASP.NET MVC?

В настоящее время я делаю следующее:

  • Добавление записи к самому началу моего метода RegisterRoutes:

    routes.IgnoreRoute("favicon.ico");
    
  • Размещение favicon.ico в корне моего приложения (которое также будет корнем моего домена).

У меня есть два вопроса:

  • Невозможно ли поместить favicon.ico где-то, кроме корня моего приложения. Это довольно нехорошо, прямо на том же уровне, что и Content и Controllers.
  • Является ли это утверждение IgnoreRoute("favicon.ico") достаточным - или я должен также сделать следующее, как описано в блоге от Фила Хака. Я не знаю, когда-либо видел запрос к favicon.ico в любом каталоге, кроме корня, - что сделало бы это ненужным (но хорошо знать, как это сделать).

    routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
    
  • 4
    Ваше регулярное выражение должно быть '\.' для точки в favicon.ico, а не просто «.».
  • 1
    Это то, что я использую (учитывает рекомендации @ NathanAldenSr, поддерживает как прямую, так и обратную косую routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*[/\\])?favicon\.((ico)|(png))(/.*)?" }); , а также допускает файлы favicon.png): routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*[/\\])?favicon\.((ico)|(png))(/.*)?" });
Показать ещё 2 комментария
Теги:
razor
asp.net-mvc
favicon

6 ответов

170
Лучший ответ

Размещение favicon.ico в корне вашего домена действительно влияет только на IE5, IIRC. Для более современных браузеров вы можете включить тег ссылки, чтобы указать на другой каталог:

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

Вы также можете использовать файлы non-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]-->
  • 22
    Вам нужно использовать @ Url.Content для генерации ссылки, чтобы она работала во всех средах. Смотрите ответ AlexC
  • 5
    Правда для ASP.NET. Мой ответ иллюстрирует «общую» версию (обычный HTML), поэтому любой может изменить ее в соответствии со своим выбором фреймворка / языка :)
Показать ещё 2 комментария
197

Я согласен с ответом Криса, но, видя, что это конкретный вопрос 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), поэтому любой мог изменить ее в соответствии со своим выбором фреймворка / языка :)
  • 9
    Всегда под рукой, чтобы получить работу «вырезать и вставить» без двусмысленности. Благодарю.
Показать ещё 3 комментария
16

1) Вы можете поместить свой значок там, где хотите, и добавить этот тег в свою страницу

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

хотя некоторые браузеры будут пытаться получить favicon из /favicon.ico по умолчанию, поэтому вы должны использовать IgnoreRoute.

2) Если браузер делает запрос на значок в другом каталоге, он получит ошибку 404, которая будет прекрасной, и если у вас есть тег ссылки в ответе 1 на главной странице, браузер получит значок, который вы хотите.

  • 2
    браузеры будут искать файл .ico, если вы добавите сайт в закладки, так что это не поможет. но мне интересно, запоминает ли браузер это. я просто знаю, что в Fiddler иногда я вижу целую кучу найденных иконок. возможно, это панель инструментов Google, хотя?
  • 0
    Я думаю, что вы правы, иконки для закладок работают только иногда, я никогда не понимал, почему, может быть, это так
6

Я думаю, что favicon.ico должен находиться в корневой папке. Он просто принадлежит.

Если вы хотите использовать разные значки - поместите его в контроллер. Вы можете сделать это. Если нет - просто оставьте это в корневой папке.

  • 1
    Согласен. Он находится в корневой папке и не должен быть где-либо еще ... Нет необходимости в HTML-теге для значка, если он находится в корневой папке. Работает со всеми распространенными браузерами ...
  • 0
    Сначала мне это показалось абсолютным буллом, но, очевидно, нет никакого способа обойти это, наша логистика продолжает показывать 404 ошибки от разных пользовательских агентов.
2

Также должно быть возможно создать контроллер, который возвращает файл ico и зарегистрировать маршрут /favicon.ico, чтобы указать на этот контроллер.

0

Используйте это, а не только favicon.ico, который стремится искать файл fav icon

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

Используйте запрошенный путь и объединяйтесь с файлом значка fav, чтобы он получал точный адрес, который его поиск

С помощью этого решена ошибка Fav.icon, которая всегда поднимается на Application_Error

Ещё вопросы

Сообщество Overcoder
Наверх
Меню