新 favicon 传上去了,强制刷新、清缓存、换浏览器、换手机,图标纹丝不动。请求返回 200,一切正常。
我在这上面耗了半小时,最后发现问题根本不在浏览器。
第一步永远是确认"服务端到底返回了什么"。分别取线上响应和磁盘文件的 md5:
curl -s https://example.com/favicon.ico | md5sum
md5sum /var/www/site/favicon.ico
如果两个值不一样,说明请求根本没打到你的文件上——问题在 Nginx。
Nginx 的 location 匹配优先级里,= 精确匹配是最高的,会压过普通前缀匹配。很多反向代理配置里会留这么一段:
location = /favicon.ico {
proxy_pass http://127.0.0.1:3000;
}
只要它存在,/favicon.ico 就永远被转发到后端服务,跟你在磁盘上换多少次文件都没关系。注释掉它(或改成指向真实文件)再执行 nginx -t && systemctl reload nginx 即可。
Debian 系习惯用软链把 sites-available 里的配置挂到 sites-enabled。但有些环境是复制过去的独立文件——你改了 available,enabled 纹丝不动。
一条命令确认:
ls -l /etc/nginx/sites-enabled/
开头是 lrwxrwxrwx 才是软链;如果是 -rw-r--r--,那就是副本,得直接改 enabled 里的文件。这个坑我踩过两次,第二次才记住先看 ls。
确认服务端返回的是新文件之后,浏览器缓存才轮到登场。给引用加个版本号破戳,下次换图标只改这个串就行:
<link rel="icon" type="image/x-icon" href="/favicon.ico?v=20260909" />
顺序记牢:服务端返回了什么 → Nginx 怎么路由 → 最后才是缓存。反着查,你会一直在浏览器里打转。