适用场景:你用
python manage.py runserver或gunicorn + nginx部署了 Django 项目,修改了 CSS、JS 或图片文件,刷新浏览器后没有任何变化。
问题现象
明明改了 CSS 颜色,网页还是旧的。
加了新图片,页面不显示。
直接在浏览器地址栏输入静态文件 URL,发现内容没变。
根本原因
浏览器缓存 + Django 静态文件收集机制双重夹击:
浏览器会把下载过的 CSS/图片存到本地(
Cache-Control、ETag),下次直接读缓存,不请求服务器。Django 在生产环境(
DEBUG=False)下不会自动提供静态文件,需要通过collectstatic把文件复制到 Nginx 服务的目录。
完整排查步骤
第一步:确认你修改的是正确的位置
❌ 不要直接改
staticfiles/目录(那是collectstatic的目标文件夹,会被覆盖)。✅ 应该修改 Django 项目中的
static/源目录(或各 app 下的static/)。
bash
# 比如你的项目结构 /root/ashburn/static/mirror/application/blocks/accordion/view.css
第二步:重新收集静态文件
bash
cd /root/ashburn source venv_linux/bin/activate python manage.py collectstatic --noinput
这一步会把static/里的所有文件复制到STATIC_ROOT(例如/var/www/ashburn/staticfiles/)。
第三步:确认目标文件已更新
bash
grep "你修改的独特字符串" /var/www/ashburn/staticfiles/对应路径/你的文件.css
如果有输出,说明服务器端已经正确。
第四步:强制刷新浏览器(这一步最重要)
Windows/Linux:
Ctrl + Shift + RMac:
Cmd + Shift + R
或者直接打开无痕模式访问网站。
第五步:直接访问静态文件 URL 验证
在地址栏输入:
text
https://你的域名/static/path/to/file.css?v=20260609
查看返回的内容是否包含你的修改。如果包含,说明 Nginx 正常,问题只是浏览器缓存。
终极解决方案(一劳永逸)
在模板中引用静态文件时,加上版本号参数:
django
{% load static %} <link rel="stylesheet" href="{% static 'css/style.css' %}?v=2">每次修改文件后,把?v=2改为?v=3,浏览器会强制下载新文件。
🛠️ 如果以上所有方法都无效
可能是以下原因:
Nginx 的
location /static/配置的alias路径不正确。文件权限问题(Nginx 用户
www-data无法读取)。缓存服务器(如 CDN)拦截。