apache部署python应用时,静态资源需由apache直接托管(如alias /static),再通过mod_expires和mod_headers精准设置强缓存头(如max-age=31536000、immutable),动态接口则必须禁用缓存(no-cache)。

Apache 部署 Python 应用(如 Flask、Django)时,静态资源(CSS、JS、图片等)默认不带强缓存头,浏览器每次都会发起请求,拖慢页面加载。要真正提升性能,关键不是让整个 Python 应用缓存,而是精准控制其 静态资源路径 的缓存行为——动态接口仍需禁用缓存,静态文件则设长效缓存。
确认静态资源由 Apache 直接服务
这是前提:Python 应用的静态文件(如 /static/ 或 /media/)必须由 Apache 通过 Alias 或 WSGIScriptAlias 外的独立路径托管,不能经由 WSGI 转发。否则 Apache 无法对这些文件应用 mod_expires 规则。
- 典型配置示例(在虚拟主机内):
Require all granted
只有这样,后续的缓存指令才能生效。
启用 mod_expires 并按 MIME 类型设过期时间
在同一个 <virtualhost></virtualhost> 块中,添加以下配置。注意:必须包裹在 <ifmodule mod_expires.c></ifmodule> 内,且 ExpiresActive On 不可省略:
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/png "access plus 2 weeks"
ExpiresByType image/jpeg "access plus 2 weeks"
ExpiresByType image/webp "access plus 2 weeks"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresDefault "access plus 1 day"
使用 access plus X(而非 now plus X),确保每个用户首次访问起算,缓存行为稳定可靠。
补充 Cache-Control 响应头增强控制力
仅靠 Expires 不够:现代浏览器优先信任 Cache-Control: max-age=。需配合 mod_headers 补充设置:
# 对已知静态路径统一加强缓存
Header set Cache-Control "public, max-age=31536000, immutable"
immutable 对带哈希名的文件(如 main.a1b2c3.js)特别有用,可防止用户手动刷新(F5)导致缓存失效。
明确禁止动态内容缓存
Python 生成的 HTML、JSON 接口、模板渲染页等,必须禁用缓存,避免用户看到陈旧数据:
Header set Cache-Control "no-cache, no-store, must-revalidate"
如果你用的是 Django,其 /admin/ 或 Flask 的调试页也属于此类,一并包含在匹配规则中更稳妥。
验证是否真实生效
重启 Apache 后,别只看配置文件是否写对。打开 Chrome DevTools → Network 标签页,刷新页面,点击一个 JS 或 CSS 文件,检查 Response Headers 中是否同时出现:
Expires: [未来某天]Cache-Control: public, max-age=31536000, immutable
两者一致且数值合理,说明配置已起效。若只看到 Cache-Control: no-cache,大概率是路径没匹配上,或被更高优先级的配置覆盖了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











