网站favicon转Base64失效问题排查及favicon声明方式咨询
为什么我的Favicon获取函数在部分网站失效?完整Favicon声明方式解析
你遇到的问题其实很常见——浏览器获取Favicon的逻辑比你函数里处理的要多得多,那个ipwatchdog.com网站的图标就属于默认根目录的隐式声明,你的函数完全没处理这种情况。
先说说你遗漏的核心点
当网页没有通过<link>标签声明任何Favicon时,浏览器会自动向网站根目录发起请求:http://[域名]/favicon.ico。这个ipwatchdog.com就是把图标放在了这个默认位置,所以浏览器能显示,但你的函数因为只遍历<link>标签,自然找不到。
完整的Favicon声明/获取方式汇总
浏览器获取Favicon的优先级和方式主要有这些:
- 默认根目录的
favicon.ico:这是最传统的方式,不需要任何HTML标签,浏览器会自动请求。很多老网站或者没特意配置的网站都会用这个。 - 标准
<link>标签声明:rel="icon":HTML5标准写法,支持PNG、SVG等多种格式,也可以搭配sizes属性指定尺寸(比如sizes="32x32")rel="shortcut icon":旧版IE的兼容写法,现在主流浏览器也都支持,常和rel="icon"一起写
- 带尺寸的多分辨率图标:针对不同设备/场景提供不同尺寸的图标,比如:
<link rel="icon" sizes="16x16" href="/favicon-16x16.png"> <link rel="icon" sizes="32x32" href="/favicon-32x32.png"> - 苹果设备专属图标:用于iOS设备添加到主屏幕时的图标:
<link rel="apple-touch-icon" href="/apple-touch-icon.png"> <link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-precomposed.png"> - Windows磁贴图标:通过meta标签声明Windows系统的磁贴图标:
<meta name="msapplication-TileImage" content="/mstile-144x144.png"> - SVG格式Favicon:现代浏览器支持的矢量图标,缩放不失真:
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> - 动态生成的Favicon:通过JavaScript动态修改
<link>标签,或者用Canvas生成图标后替换(比如一些网站的通知角标)
对你的函数的修改建议
要解决这个问题,你需要在遍历完<link>标签没找到图标的逻辑里,添加默认根目录图标的尝试:
- 当循环结束后
ico还是默认图标的时候,生成目标网站根目录的favicon.ico地址(比如http://www.ipwatchdog.com/favicon.ico) - 调用
getimg检查这个地址是否有效,如果有效就返回它,否则再用默认图标 - 另外,你函数里的URL拼接逻辑可以优化,比如处理相对路径时,确保基于网站的根域名正确拼接(比如避免把
site变量直接拼,应该保留协议或者正确的根路径)
举个修改后的逻辑片段:
// 遍历完link标签后 if (ico === 'https://mysite.me/R/link.png') { // 尝试默认根目录的favicon.ico const siteParts = site.split('//'); const domain = siteParts[1].split('/')[0]; const defaultIco = `${siteParts[0]}//${domain}/favicon.ico`; getimg(defaultIco, function(b, bool) { if (bool) { cb(b, bool); } else { cb('https://mysite.me/R/link.png', false); } }); } else { // 原来的逻辑 getimg(ico, function(b, bool){cb(b,bool);}); }
内容的提问来源于stack exchange,提问作者Ben Muircroft




