python - 在浏览器中缓存静态文件
问题描述
我正在尝试为 .css 和 .js 等静态文件启用缓存。我正在使用 Python 运行 WSGI 服务器。
我尝试设置以下标头以用于缓存目的:
headers.add_header('Cache-control', f'public, max-age={expires.strftime(RFC_1123_DATE)}')
headers.add_header('Expires', expires.strftime(RFC_1123_DATE))
headers.add_header('Last-Modified', generate_last_modified())
在浏览器中收到的标头:
HTTP/1.0 200 OK
Date: Tue, 21 Apr 2020 08:06:17 GMT
Server: WSGIServer/0.2 CPython/3.6.9
Content-Encodings:
Content-Type: text/css; charset=UTF-8
Cache-control: public, max-age=Tue, 28 Apr 2020 08:06:17 GMT
Expires: Tue, 28 Apr 2020 08:06:17 GMT
Content-Length: 23399
Last-Modified: Tue, 21 Apr 2020 08:06:1587452777S GMT
Accept-Ranges: bytes
使用 Chrome 时,此代码可以正常工作,并且文件会按照您的预期从缓存中存储和检索。Chrome 正在使用Expires标头并忽略Cache-Control标头。
我检查了我的开发人员工具,但未启用禁用缓存。我在 Firefox 的 about:config 中检查了我的设置,似乎启用了缓存。
那么我在这里错过了什么?我是否缺少标题,是否需要 ETAG,为什么Expires在 Chrome 中工作但在 Firefox 中没有?
解决方案
我找到了解决方案。
Firefox 缓存已满,因此在清空缓存后,它开始再次发送if-modified-since标头。
此外,我的服务器将当前时间作为最后修改时间返回,而不是实际的最后修改时间。
为了解决这个问题,我所要做的就是将浏览器中的if-modified-since时间与文件中的最后修改时间进行比较,如果没有任何变化,则发送 304 状态。
推荐阅读
- android - 成功构建 gradle 后,Android 应用程序在运行时崩溃
- javascript - Jqgrid 服务器端数据未加载到第二个 Jquery 选项卡中
- r - 在 Shiny 中为输出创建函数
- python - 使用 PyInstaller 创建 Onefile 会破坏 tkinter 窗口的透明度
- python - 与给定句子最相关的术语,nltk word2vec
- android-studio - AVC 被拒绝... Kotlin android studio
- chatbot - Amazon 服务是否支持本地托管?
- javascript - 根据 div 样式显示 div 100%
- model - PROMELA 中的 skip 和 break 到底有什么区别?
- swift4 - UIButton单击事件在UIStackView Swift4中不起作用