2009-09-11 51 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

相關問題