什么是最好的方式来设置与Django的图像远期过期?
我使用django-compress与远期将过期为我的CSS和JS文件。很棒。什么是最好的方式来设置与Django的图像远期过期?
我想为其他静态内容(图像,Flash等)做类似的事情。我可以为这个内容设定一个遥远的未来,但我必须在文件更改时手动重命名这些文件。
有没有更好的方法来处理这个问题?
使用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来向客户端指示文件(例如图像)已更改,您无能为力。这是由例如Apache和YAHOO!
实施这是IMO不太难。它分为两部分:
- 使用标记(这里是useful snippet)生成版本化的URL到媒体文件,这些URL将出现在您的HTML中。版本化的URL可以是插入版本的基本URL,例如
/media/3/header.png
其中实际文件在服务器上保持为/media/header.png
。 - 使用类似
mod_rewrite
的工具将传入的URL转换为规范值,即请求/media/3/header.png
转换为/media/header.png
。 This article更详细地描述了该特征。
最好的办法是用版本化的URL引用你的静态文件,并给你的Web服务器一个重写规则来忽略版本。
看到一个完整的Django示例here,其包括expire_tag
辅助(由Arne Brodowski创建):
<link rel="stylesheet" type="text/css"
href="{{ MEDIA_URL }}{% expire_tag "css/reset.css" %}" />
和有关的Apache重写规则。
现在,这很漂亮。我必须记住那一个。 – 2009-09-12 10:32:20
不错的,次要的缺点是,这种方法不会在css内引用版本图像。 – Bula 2013-04-26 16:40:36
我知道如何设置图像的远期未来,但我想知道在编辑图像时是否有更好的方法来处理。假设我有header.png,将来会过期。然后我在Photoshop中进行编辑。我必须将其命名为header1.png,然后将代码中的任何引用更改为header1.png。对我不理想。 – 2009-09-11 18:45:32