【发布时间】:2009-09-11 15:13:40
【问题描述】:
我正在使用 django-compress 来处理我的 css 和 js 文件。效果很好。
我想对其他静态内容(图像、flash 等)做类似的事情。我可以为此内容设置一个远期过期,但我必须在文件更改时手动重命名它们。
有没有更好的方法来处理这个问题?
【问题讨论】:
标签: django
我正在使用 django-compress 来处理我的 css 和 js 文件。效果很好。
我想对其他静态内容(图像、flash 等)做类似的事情。我可以为此内容设置一个远期过期,但我必须在文件更改时手动重命名它们。
有没有更好的方法来处理这个问题?
【问题讨论】:
标签: django
最好的方法是使用带有版本的 URL 引用您的静态文件,并为您的 Web 服务器提供重写规则以忽略该版本。
查看完整的 Django 示例 here,其中包括一个 expire_tag 助手(由 Arne Brodowski 创建):
<link rel="stylesheet" type="text/css"
href="{{ MEDIA_URL }}{% expire_tag "css/reset.css" %}" />
以及相关的Apache重写规则。
【讨论】:
使用django-compress,您将 CSS 和 JS 视为动态文件 - 这很好。但是,其他文件是静态的 - Django 并不想提供这些文件。它们应该由 Apache 或其他网络服务器直接提供服务。
使用 Apache,您可以使用类似的东西
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>
在 .htaccess 或全局 Apache 配置中。
更新:回复您的评论 - 抱歉,我不明白您的问题的细微差别。您无法避免使用不同的 URL 向客户端指示文件(例如图像)已更改。这是由例如推荐的。阿帕奇和雅虎!
IMO 实施这一点并不难。分为两部分:
/media/3/header.png 实际文件在服务器上仍为 /media/header.png。mod_rewrite 之类的工具将传入的 URL 转换为规范值,即对/media/3/header.png 的请求被转换为/media/header.png。 This article 更详细地描述了该功能。【讨论】: