我爲我的CSS/Javascript設置了far-future expires頭文件,以便瀏覽器在獲取緩存後不再請求文件。我也有一個簡單的版本機制,如果文件改變,客戶端就會知道。使用Django進行靜態文件版本控制
基本上我有一個模板標籤,我這樣做
<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腳本(現在手動運行,可能會添加預先提交掛鉤)生成,該腳本檢查文件是否已更改(使用git diff
)。
這都是做工精細,除了:
我想要實現同一種版本的圖像,以及。但圖像可以從CSS引用 - 這是一個靜態文件(由nginx提供) - 因此沒有模板標籤。
什麼是文件版本控制的更好方法?
或者,我正在考慮用返回響應之前更改所有鏈接的中間件替換模板標記。這比模板標籤要好,可能會被誤刪。但仍然不能解決CSS引用的圖像問題。
此外,我知道將版本作爲查詢字符串的一部分可能會導致某些代理不緩存文件,從而導致出現問題 - 因此我考慮將版本部分作爲文件名 - 例如javascript/c/c.123456.js
。
注意:看起來像使用Django無法解決這個問題(很明顯 - 因爲我甚至沒有通過Django服務於CSS)。但必須有一個解決方案,可能涉及一些nginx技巧。
回答@paluh下面是你最好的選擇。在Django中從文件中提取文件的時間並不會節省您直接檢查Django中文件的時間。它只是增加了一層額外的複雜性和另一個失敗點(shell腳本作爲cron作業運行)。 – 2011-05-12 15:18:37
的確,mtimes可以讓我的設置更簡單 - 減少運行腳本和依賴git的需要。我通常不信任mtimes(當它複製到另一個文件系統或備份時,它們可能會發生變化,或者......) - 但在這種情況下,我認爲它並不重要,因爲源代碼樹總是在同一個地方。另外,如果由於某種原因m次真的發生變化,那麼發生的最糟糕的情況是緩存失效。不可怕。 – ibz 2011-05-13 02:11:14
如何處理CSS文件的預部署步驟?我做了類似的事情,但沒有與Django做類似的事。這是一些自定義的PHP。 – 2011-05-15 11:24:37