2009-12-19 55 views
2

我使用PHP來壓縮我的靜態Javascript和CSS文件。當請求原始文件時,服務器將發送Last-ModifiedETag標題。我還沒有用PHP發送這些信息。我也看到了使用Cache-controlExpires標題的建議以及一些我不記得的內容。我應該使用哪些標頭來提供靜態內容?

那前兩個就夠了嗎?我想我可以很容易地使用PHP獲取最後修改日期,但是如何生成ETag?

如果最好包含其他兩個,那麼將這些附加到其他文件(如圖像)的最佳方法是什麼?也許通過.htaccess? (我沒有直接訪問服務器。)

+2

爲什麼如果它們是靜態的,使用PHP進行gzipping?爲什麼不gzip他們一次,讓Apache服務他們?或者使用mod_deflate ... – mopoke 2009-12-19 01:53:01

+0

因爲1)並非所有瀏覽器都支持gzip(正確),並且2)誰需要額外的構建/部署步驟? – cletus 2009-12-19 02:44:42

+0

我可以指定要從'.htaccess'文件中壓縮/縮小的文件嗎?這會更快嗎? – DisgruntledGoat 2009-12-19 20:22:22

回答

1

對於ETag,您可以使用任何值,但我更喜歡使用當前文件[s]的md5_file()sha1_file()作爲唯一標識符內容(不應該真的有這麼多的衝突)。

在任何輸出之前執行此操作。

<?php header("Etag: " . sha1_file(basename($_SERVER[ 'PHP_SELF' ]))); ?> 

,或者你可以讓阿帕奇爲你做它在.htaccess(如果啓用它,這通常是):

# if we're clustered this will still be cool 
FileETag MTime Size 

如果你想設置一個長的到期(此雖然是有點危險的),你也可以這樣做:

# turn on far-future expiration dates 
# to cache content longer (30 days) 
ExpiresActive On 
ExpiresDefault A2592000 

但要小心,你將不得不作出一個版本,你必須改變你每次更新文件時,該文件()的。

+0

我可以只爲圖像做這個嗎?也許使用''指令?你怎麼生成代碼'A2592000'? – DisgruntledGoat 2009-12-19 20:16:47

+0

你可以只爲圖像做這個,查看apache命令ExpiresByType(例如,你可以做image/jpeg)。因此,您的mime文件中的任何類型(通常是image/png,image/gif,image/jpeg)都可以設置爲此。你也可以在這個命令上做到這一點,我想,但按類型看起來像是一個更好的解決方案(如果你使用PHP圖像?)。 A2592000是30天內的秒數(做數學或相信我,:P) – 2009-12-20 20:00:16

+0

確定獲得數字,2592000,爲什麼'A'在前面?這是指定單位還是什麼? – DisgruntledGoat 2009-12-29 17:54:12

1

參見:

基本上你想:

  • 最小化您發送(通過將它們結合起來,拼合等)的文件數量;
  • 最小化所有Javascript文件;
  • GZip的一切(對正確支持它的瀏覽器);和
  • 版本的一切。

通過版本控制我的意思,而不是:

<img src="/images/logo.gif"> 

添加一些東西來表示一個「版本」之類的文件的修改時間:

<img src="/images/logo.gif?1234568899"> 

與遙遠的未來結合這Expires頭所以瀏覽器只會請求一次文件。然後,當您希望瀏覽器獲得新副本時,您可以更改版本號。

恕我直言,這遠遠優於涉及ETag之類的方法。

+0

感謝您的提示。有沒有辦法在當前日期之後的幾個月內自動設置過期標題?看起來我可以在htaccess中使用'Header set Expires'Thu,15 Apr 2010 20:00:00 GMT'',但是當那天接近時,我將不得不再提前幾個月... – DisgruntledGoat 2009-12-29 18:16:01

0

Apache使用inode-size-timestamp作爲Etag,但如果您擁有一組Web服務器,則不起作用。在這種情況下,您可以使用url-size-timestamp的md5。 More info in the Etag section here

我建議不要計算整個文件的md5,因爲這可能在大文件(例如圖像,音頻,視頻)上很昂貴。

0

爲什麼不直接使用Apache來提供靜態請求?

它可以壓縮的東西,以及正確設置標題,並猜測是什麼,它也處理邊緣情況。

正確處理條件請求並不明顯,我認爲您不應該嘗試這樣做。使用已經做到的Web服務器。

也就是說,並不是所有的默認值都有意義。如果您的站點有多個Web服務器,並且在不經常更改的內容上設置「Expires」標頭,則可能應該禁用ETag,如果您希望客戶端的緩存最有用,那麼這是非常必要的。

看有點居高臨下,

http://developer.yahoo.com/performance/rules.html

這將幫助你。