本质是一句话:
favicon 是“站点根路径资源”,但 Django 的 static 默认是“带前缀的资源” 所以你现在卡在
/favicon.ico和/static/之间了。
下面我直接给你 2 种靠谱方案,按「推荐程度 + 你现在的部署方式」来讲,你照着选一个就行。
✅ 方案一(最推荐 / 正统做法):
favicon 仍然走 static,但通过 <link> 显式声明
👉 不用强行让 /favicon.ico 存在
1️⃣ 文件放哪里?
放在你已经能正常访问的 static 体系里,比如:
app/
static/
img/
favicon.ico或
static/
favicon.ico然后 collectstatic,最终会到:
/www/wwwroot/banshidawang/staticfiles/favicon.ico2️⃣ 模板里明确告诉浏览器 favicon 在哪
在 base.html 的 <head> 里加:
{% load static %}
<link rel="icon" href="{% static 'favicon.ico' %}">或者你放在子目录:
<link rel="icon" href="{% static 'img/favicon.ico' %}">3️⃣ 结果是?
- 浏览器会优先使用你声明的
- 就算
/favicon.ico404,也不影响 - 不和 Django / Nginx 静态规则打架
✅ 这是 Django 官方 & 实战中最干净的方式
现在 90% 的站点都这么干
✅ 方案二(想要 /favicon.ico 真存在):
Nginx 单独给它开“直通规则”
适合你这种 工程文件不能乱丢、static 有前缀的部署。
1️⃣ favicon 仍然放 staticfiles 里
比如最终位置:
/www/wwwroot/banshidawang/staticfiles/favicon.ico2️⃣ 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/体系
✔ 这是“服务器级”解决方案,很稳
