我正在为我的 CSS/Javascript 设置远期过期标头,以便浏览器在缓存后不再要求文件。我还有一个简单的版本控制机制,这样如果文件发生变化,客户就会知道。
基本上我有一个模板标签,我做了类似的事情
<script type="text/javascript" src="{{ MEDIA_URL }}{% versioned "javascript/c/c.js" %}"></script>
这将成为
<script type="text/javascript" src="http://x.com/media/javascript/c/c.min.js?123456"></script>
.
模板标签打开一个文件javascript/c/c.js.v
,在其中找到版本号并将其附加到查询字符串中。该版本由一个 shell 脚本生成(现在手动运行,可能会添加 pre-commit 钩子),该脚本检查文件是否已更改(使用git diff
)。
这一切都很好,除了:
我也想为图像实现相同类型的版本控制。但是图像可以从 CSS 中引用——这是一个静态文件(由 nginx 提供)——所以那里没有模板标签。
文件版本控制的更好方法是什么?
或者,我正在考虑用一个中间件替换模板标签,该中间件会在返回响应之前更改所有链接。这比模板标签要好,模板标签可能会被错误地省略。但仍然没有解决从 CSS 引用的图像的问题。
另外,我知道将版本作为查询字符串的一部分可能会导致某些代理不缓存文件的问题 - 所以我考虑将版本作为文件名的一部分 - 例如javascript/c/c.123456.js
.
注意:看起来没有办法使用 Django 来解决这个问题(显然——因为我什至不通过 Django 提供 CSS)。但必须有一个解决方案,可能涉及一些 nginx 技巧。