如何在Django服务器响应头中添加静态文件压缩头以通过PageSpeed检测?
解决Django静态文件压缩响应头不生效的问题
我之前也碰到过一模一样的情况,折腾了好一会儿才找到问题所在,给你梳理几个关键排查点:
1. 先确认压缩中间件的顺序是否正确
Django中间件的执行顺序非常关键,GZipMiddleware(或BrotliMiddleware如果要用br压缩)的位置必须放对:
- 它要放在所有会修改或生成响应内容的中间件之后,比如
django.middleware.common.CommonMiddleware之后,确保它拿到的是最终要返回的响应内容再进行压缩。 - 如果同时用Brotli压缩,记得先装依赖包:
pip install brotli,再把django.middleware.brotli.BrotliMiddleware加到中间件列表里。
正确的中间件配置示例:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 压缩中间件放在这里,确保后续中间件不会修改已压缩的内容 'django.middleware.gzip.GZipMiddleware', # 如果用Brotli的话加这行 # 'django.middleware.brotli.BrotliMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
2. 检查压缩的触发条件是否满足
Django默认只会压缩符合以下条件的响应:
- 响应内容大小超过200字节(你的JS文件23KB,满足)
- 响应的
Content-Type属于GZIP_CONTENT_TYPES配置列表,默认包含application/javascript,但如果你自定义过这个配置,记得检查是否包含对应的类型:
# settings.py 里如果有这个配置,确保包含你的文件类型 GZIP_CONTENT_TYPES = [ 'text/html', 'text/css', 'application/javascript', 'text/javascript', ]
3. 注意:开发服务器(runserver)不处理静态文件的中间件!
这是最容易踩的坑!你当前用的是Django自带的开发服务器(响应头里的WSGIServer/0.2 CPython/3.6.8能看出来),它处理静态文件请求时,是直接读取文件返回,不会走中间件链,所以你加的压缩中间件根本没作用在静态文件上!
验证这个问题的方法:
- 写一个简单的视图,返回一段超过200字节的文本内容,然后请求这个视图,看响应头是否有
Content-Encoding: gzip。如果有,说明中间件本身是好的,只是静态文件请求没经过中间件。
解决办法:
- 开发环境下,可以用
Whitenoise来处理静态文件,它会自动应用中间件。安装后在中间件列表最前面加whitenoise.middleware.WhiteNoiseMiddleware,并在settings里加:
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' WHITENOISE_USE_FINDERS = True WHITENOISE_AUTOREFRESH = True # 开发环境自动刷新
- 生产环境下,要么用Whitenoise,要么用Nginx这类反向代理来处理静态文件压缩(通常更推荐后者,性能更好)。
4. 用curl测试避免浏览器缓存干扰
有时候浏览器会缓存未压缩的旧文件,导致你看不到更新后的响应头。用curl命令强制测试:
curl -H "Accept-Encoding: gzip, br" -I -H "Pragma: no-cache" https://22186d6d.ngrok.io/your-static-file.js
看输出里是否有Content-Encoding: gzip(或br)。
最后补充
如果用了第三方静态文件存储(比如S3),还要确保存储服务支持返回压缩后的文件,或者你在上传时就已经生成了压缩版本。
内容的提问来源于stack exchange,提问作者user10898133
相关产品推荐
相关产品推荐

