You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

网站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>标签没找到图标的逻辑里,添加默认根目录图标的尝试:

  1. 当循环结束后ico还是默认图标的时候,生成目标网站根目录的favicon.ico地址(比如http://www.ipwatchdog.com/favicon.ico
  2. 调用getimg检查这个地址是否有效,如果有效就返回它,否则再用默认图标
  3. 另外,你函数里的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

火山引擎 最新活动