2009-09-11 49 views
5

我使用django-compress与远期将过期为我的CSS和JS文件。很棒。什么是最好的方式来设置与Django的图像远期过期?

我想为其他静态内容(图像,Flash等)做类似的事情。我可以为这个内容设定一个遥远的未来,但我必须在文件更改时手动重命名这些文件。

有没有更好的方法来处理这个问题?

回答

4

使用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不太难。它分为两部分:

  1. 使用标记(这里是useful snippet)生成版本化的URL到媒体文件,这些URL将出现在您的HTML中。版本化的URL可以是插入版本的基本URL,例如/media/3/header.png其中实际文件在服务器上保持为/media/header.png
  2. 使用类似mod_rewrite的工具将传入的URL转换为规范值,即请求/media/3/header.png转换为/media/header.pngThis article更详细地描述了该特征。
+0

我知道如何设置图像的远期未来,但我想知道在编辑图像时是否有更好的方法来处理。假设我有header.png,将来会过期。然后我在Photoshop中进行编辑。我必须将其命名为header1.png,然后将代码中的任何引用更改为header1.png。对我不理想。 – 2009-09-11 18:45:32

6

最好的办法是用版本化的URL引用你的静态文件,并给你的Web服务器一个重写规则来忽略版本。

看到一个完整的Django示例here,其包括expire_tag辅助(由Arne Brodowski创建):

<link rel="stylesheet" type="text/css" 
    href="{{ MEDIA_URL }}{% expire_tag "css/reset.css" %}" /> 

和有关的Apache重写规则。

+0

现在,这很漂亮。我必须记住那一个。 – 2009-09-12 10:32:20

+0

不错的,次要的缺点是,这种方法不会在css内引用版本图像。 – Bula 2013-04-26 16:40:36

相关问题