如何防止favicon.ico请求?

时间:2009-08-24 11:37:17

标签: favicon

我没有favicon.ico,但IE总是提出请求。

是否可以阻止浏览器请求我网站的favicon?也许HTML标题中有一些META-TAG?

14 个答案:

答案 0 :(得分:497)

我首先要说网页上有一个图标是一件好事(通常)。

然而,并不总是需要它,有时开发人员需要一种方法来避免额外的有效载荷。例如,IFRAME会在不显示的情况下请求图标。 最糟糕的是,在Chrome和Android中,IFRAME会产生3个关于favicon的请求:

"GET /favicon.ico HTTP/1.1" 404 183
"GET /apple-touch-icon-precomposed.png HTTP/1.1" 404 197
"GET /apple-touch-icon.png HTTP/1.1" 404 189

以下使用数据URI,可用于避免假的favicon请求:

<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> 

有关参考资料,请参阅此处:

Chrome错误/行为可能会在即将推出的版本中修复。

以下是您投票的错误提交:

更新1:

从评论(jpic)看起来Firefox&gt; = 25不再喜欢上面的语法了。我在Firefox 27上进行了测试,但它仍可在Webkit / Chrome上运行时无效。

所以这里应该涵盖所有最近的浏览器。我测试了Safari,Chrome和Firefox:

<link rel="icon" href="data:;base64,=">

我从“rel”属性值中省略了“快捷方式”名称,因为这仅适用于较旧的IE和IE的版本&lt; 8也不喜欢dataURI。未在IE8上测试过。

更新2:

如果您需要对HTML5进行验证,请使用此代码:

<link rel="icon" href="data:;base64,iVBORw0KGgo=">

答案 1 :(得分:65)

只需将以下行添加到HTML文件的<head>部分:

<link rel="icon" href="data:,">

此解决方案的特点:

  • 100%有效HTML5
  • 很短
  • 不会引起IE 8及更早版本的任何怪癖
  • 不会使浏览器将当前的HTML代码解释为favicon(href="#"会出现这种情况)

答案 2 :(得分:42)

我相信我已经看过这个(我没有测试过它或亲自使用过它)

<link rel="shortcut icon" href="#" />

有没有类似的经历?

修改

我刚刚测试了上面的代码片段并且在强制完全刷新时,Fiddler没有看到任何favicon请求。我针对IE8(Compat模式为IE7标准)和FF ​​3.6进行了测试。

答案 3 :(得分:34)

你做不到。您所能做的就是尽可能减小图片,并在将来设置一些缓存失效标题(ExpiresCache-Control)。这是关于favicon.ico请求的what Yahoo! has to say

答案 4 :(得分:5)

将其放入您的 HTML 头部:

<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC">

这比其他答案要大一些,但确实包含一个实际有效的 PNG 图像(1x1 像素白色)。

答案 5 :(得分:4)

您可以使用.htaccess或服务器指令拒绝访问favicon.ico,但服务器会向浏览器发送拒绝访问回复,这仍然会减慢页面访问速度。

当用户返回您的网站时,您可以停止浏览器请求favicon.ico,方法是让它留在浏览器缓存中。

首先,提供一个小的favicon.ico图像,可能是空白的,但尽可能小。我制作了一个200字节以下的黑白电影。然后,使用.htaccess或server指令,将文件Expires标头设置为将来一两个月。当同一用户返回您的站点时,它将从浏览器缓存加载,并且没有请求将转到您的站点。服务器日志中也不再有404。

如果您可以控制整个Apache服务器或虚拟服务器,则可以执行以下操作: -

如果服务器文档根目录是/ var / www / html,那么将其添加到/etc/httpd/conf/httpd.conf: -

Alias /favicon.ico "/var/www/html/favicon.ico"
<Directory "/var/www/html">
    <Files favicon.ico>
       ExpiresActive On
       ExpiresDefault "access plus 1 month"
    </Files>
</Directory>

然后,单个favicon.ico将适用于所有虚拟托管网站,因为您对它进行别名处理。用户访问后,它将从浏览器缓存中抽出一个月。

对于.htaccess,据说这是有效的(我没有查看): -

AddType image/x-icon .ico
ExpiresActive On
ExpiresByType image/x-icon "access plus 1 month"

答案 6 :(得分:3)

一个非常简单的解决方案是将以下代码放在.htaccess中。我有同样的问题,它解决了我的问题。

<IfModule mod_alias.c>
    RedirectMatch 403 favicon.ico
</IfModule>

参考:http://perishablepress.com/block-favicon-url-404-requests/

答案 7 :(得分:3)

出于测试目的暂时阻止这些的最简单方法是通过右键单击页面上的任意位置并单击检查或按 Ctrl+Shift+j 然后转到网络选项卡,然后在 chrome 中打开检查页面重新加载页面,该页面将发送您的页面应该发出的所有请求,包括烦人的 favicon.ico。您现在只需右键单击 favicon.ico 请求,然后单击“阻止请求 URL”。

screenshot of blocking a specific request URL for Chrome browser

以上所有答案均适用于控制应用源代码的开发人员。如果您是系统管理员,正在计算我们的负载平衡器或代理配置并且对这个 favicon.ico 恶作剧感到恼火,那么这个简单的技巧会做得更好。此答案适用于 Chrome,但我认为您应该为 Firefox/Opera/Tor/任何其他浏览器找出类似的替代方案:)

答案 8 :(得分:2)

如果你使用nginx

# skip favicon.ico
#
location = /favicon.ico {
    access_log off;
    return 204;
}

答案 9 :(得分:2)

我个人在我的 HTML head 标签中使用了这个:

<link rel="shortcut icon" href="#" />

答案 10 :(得分:0)

根据我们的经验,当Apache在favicon.ico的请求下失败时,我们在.htaccess文件中注释掉了额外的标题。

例如我们有 标题集X-XSS-Protection&#34; 1;模式=块&#34;

...但我们忘记事先sudo a2enmod标题。评论发送的额外标题解决了我们的favicon.ico问题。

我们还设置了几个用于开发的虚拟主机,并且在使用http://localhost和获取/favicon.ico时仅使用500内部服务器错误失败。如果你运行&#34; curl -v http://localhost/favicon.ico&#34;并获得有关主机名不在解析程序缓存中的警告或类似的问题,您可能会遇到问题。

它可能就像没有提取一样简单(我们尝试了它并且它没有工作,因为我们的根本原因是不同的)或者在apache2.conf或.htaccess中查找指令可能会导致奇怪的500内部服务器错误消息。

我们发现它失败的速度很快,Apache的错误日志没有任何用处,花了整整一个上午的时间来改变小事情直到我们解决了在忘记加载mod_headers时设置额外标题的问题!

答案 11 :(得分:0)

有时,当HTML包含一些注释的代码并且浏览器试图查找某些内容时,就会出现此错误。就像在我的案例中一样,我已经在flask中注释了一个Web表单的代码,而我得到了它。

花费2个小时后,我通过以下方式对其进行了修复:

1)我创建了一个新的python环境,然后在注释的HTML行上引发了一个错误,在此之前,我仅引发错误'GET /favicon.ico HTTP / 1.1“ 404'

2)有时,当我有重复的代码(例如以相同名称存在的python文件)时,我也看到了此错误,也尝试将其删除

答案 12 :(得分:0)

在Node.js中,

res.writeHead(200, {'Content-Type': 'text/plain', 'Link': 'rel="shortcut icon" href="#"'} );

答案 13 :(得分:-10)

您可以使用

<link rel="shortcut icon" href="http://localhost/" />

这样,它实际上不会从服务器请求。