Skip to content

本质是一句话:

favicon 是“站点根路径资源”,但 Django 的 static 默认是“带前缀的资源” 所以你现在卡在 /favicon.ico/static/ 之间了。

下面我直接给你 2 种靠谱方案,按「推荐程度 + 你现在的部署方式」来讲,你照着选一个就行。


✅ 方案一(最推荐 / 正统做法):

👉 不用强行让 /favicon.ico 存在

1️⃣ 文件放哪里?

放在你已经能正常访问的 static 体系里,比如:

app/
  static/
    img/
      favicon.ico

static/
  favicon.ico

然后 collectstatic,最终会到:

/www/wwwroot/banshidawang/staticfiles/favicon.ico

2️⃣ 模板里明确告诉浏览器 favicon 在哪

base.html 的 <head>加:

{% load static %}
<link rel="icon" href="{% static 'favicon.ico' %}">

或者你放在子目录:

<link rel="icon" href="{% static 'img/favicon.ico' %}">

3️⃣ 结果是?

  • 浏览器会优先使用你声明的
  • 就算 /favicon.ico 404,也不影响
  • 不和 Django / Nginx 静态规则打架

这是 Django 官方 & 实战中最干净的方式

现在 90% 的站点都这么干


✅ 方案二(想要 /favicon.ico 真存在):

Nginx 单独给它开“直通规则”

适合你这种 工程文件不能乱丢、static 有前缀的部署。


1️⃣ favicon 仍然放 staticfiles 里

比如最终位置:

/www/wwwroot/banshidawang/staticfiles/favicon.ico

2️⃣ Nginx 增加一个精确匹配规则

server {} 里,加在最前面:

location = /favicon.ico {
    alias /www/wwwroot/banshidawang/staticfiles/favicon.ico;
    access_log off;
    log_not_found off;
}

⚠️ 注意是:

  • location = /favicon.ico
  • alias,不是 root

3️⃣ 效果

  • 访问 https://news.05320532.xyz/favicon.ico
  • Django 完全不用管
  • 不影响 /static/ 体系

这是“服务器级”解决方案,很稳