我有一个使用自己的tomcat在本地运行的Grails应用程序,我刚刚更改了一个新的favicon.问题是我无法在任何浏览器中看到它.旧的favicon出现了,或者我根本没有获得图标,但不是我的新图标.我不认为这本身就是Grails问题,更多的是关于favicons的问题.
favicons应该发生什么?它们应该如何工作?我的浏览器中有很多书签,它们有错误的图标,似乎永远不会刷新.如何强制服务器/浏览器停止缓存它们?总是缓存它们似乎很愚蠢,因为它们通常只有16x16.为什么不在每次访问页面时上传它们?这不是一个巨大的开销.
Mar*_*ark 2047
要刷新站点的favicon,您可以强制浏览器使用链接标记和文件名上的查询字符串下载新版本.这在生产环境中尤其有用,可确保您的用户获得更新.
<link rel="icon" href="http://www.yoursite.com/favicon.ico?v=2" />
Run Code Online (Sandbox Code Playgroud)
小智 811
好吧,经过10分钟的wtf'ing,解决它的简单方法接近于lineofbirds
Gar*_*ley 261
这个答案还没有给出,所以我想我会发布它.我环顾网络,并没有找到一个在本地开发中测试favicons的好答案.
在当前版本的chrome(在OSX上),如果您执行以下操作,您将立即获得favicon刷新:
这是我发现在本地更新favicon的最简单方法.
Kla*_*sen 56
重命名favicon文件并添加带有新名称的html标头,例如:
<link rel="SHORTCUT ICON" href="http://www.yoursite.com/favicon2.ico" />
Run Code Online (Sandbox Code Playgroud)
Fel*_*erg 53
如果您使用PHP,您还可以使用favicon的MD5-Hash作为查询字符串:
<link rel="shortcut icon" href="favicon.ico?v=<?php echo md5_file('favicon.ico') ?>" />
Run Code Online (Sandbox Code Playgroud)
这样,Favicon在更改后将始终刷新.
正如评论中指出的那样,您也可以使用上次修改日期而不是MD5-Hash来实现相同的功能并节省服务器性能:
<link rel="shortcut icon" href="favicon.ico?v=<?php echo filemtime('favicon.ico') ?>" />
Run Code Online (Sandbox Code Playgroud)
kon*_*nzo 50
通过销毁浏览器用于存储旧favicons的文件,您可以强制加载新的文件.
chrome.exe或firefox.exe).Favicons和Favicons-journalfavicons.sqlite这几乎肯定会奏效.如果不:
Max*_*zin 29
在Mac OS X上的Chrome中,可以使用favicon缓存删除文件
${user.home}/Library/Application Support/Google/Chrome/Default/Favicons
Run Code Online (Sandbox Code Playgroud)
art*_*ung 17
好吧,开销是开销,但是,不是太大.
此外,浏览器有时对缓存文件"贪婪".您可以清除缓存和/或重新启动浏览器,并可能会看到更改.如果那失败了......
我的廉价解决方案是:
如果该序列不起作用,则会发生其他事情.
nam*_*nam 10
对于Internet Explorer,还有另一种解决方案:
很可能是网络浏览器问题.您必须从浏览器中删除缓存,关闭浏览器并重新打开它.那应该解决它.
我不相信您的收藏夹会在您重新访问该页面之前刷新您的收藏夹,并假设您之前已清除了浏览器缓存.
您的网络浏览器不会通过互联网自行检查新的图标...谢天谢地.
我尝试了上面的许多事情(重置缓存,刷新,使用链接标记等),我甚至检查了我的.htaccess文件并重置了ExpiresByType变量.
但这最终适用于Chrome(25.0.x)和Safari(6.0.1):
<link>标签硬连接mysite.com/favicon.icomysite.com在新标签页中打开(直到第3步,在相同的选项卡中刷新,不断重现旧图标.)
对于macOS上的Chrome,如果您不想按照此处的建议删除整个Chrome favicon数据库,则只能删除有冲突的图标:
sqlite3 ~/Library/Application\ Support/Google/Chrome/Default/Favicons
select * from favicons where url = 'http://mysite.dev/favicon.ico';
delete from favicons where url = 'http://mysite.dev/favicon.ico';
或者,您可以搜索可以重复使用的模式以删除多个条目:
select * from favicons where url like 'http://mysite.dev%';
delete from favicons where url like 'http://mysite.dev%';
.exit并点击返回退出sqlite当您从Google请求favicon时,您可以查看响应标头.
Last-Modified: Fri, 09 Jan 2009 16:35:02 GMT
Date: Thu, 01 Dec 2010 00:00:01 GMT
Expires: Fri, 01 Dec 2011 00:00:01 GMT
Cache-Control: public, max-age=31536000
Age: 7
Run Code Online (Sandbox Code Playgroud)
如果您在响应中放置"Expires:"标头,则客户端浏览器将在该时间戳之后重新请求该图标.在进行活动开发时,您可以将expires时间戳设置为将来的一两秒,并始终让它获取此值,尽管这是一个糟糕的长期计划.
我写这个答案的印象是,这是在Chrome Chrome中刷新favicon所花费的.然而,事实证明这只适用于前五分钟左右,直到Chrome的历史同步中的图标无法挽回.
您不必清除缓存,重新启动浏览器或重写HTML - 只需更改图标的URL 一次,这样浏览器就会忘记以前缓存的图标.
假设您已经通过<link>页面中的元素定义了您的图标<head>,您可以通过在控制台中运行此标准JS单线程来实现:
[].slice.call(document.querySelectorAll('head>link[rel$="icon"]')).map(function(ln){ln.href+='?v=2'});
Run Code Online (Sandbox Code Playgroud)
有关此更高级的实现,可以自动为生产中的最终用户执行此操作,请参阅freshicon.js.