You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:38:02