2010-03-07 60 views
7

我的CSS文件是一個PHP文件,它提供了內容類型text/css,以便我可以在該文件中使用PHP變量。 style.php看起來是這樣的:動態css緩存頭(通過PHP生成)

<?php 
header('Content-Type: text/css'); 
$bgColor = '#000'; 
?> 

body { background:<?php print $bgColor; ?>; } 

它正常工作,但我有點擔心,如果瀏覽器緩存動態創建的CSS文件。

當看着螢火蟲的請求,在我看來,瀏覽器每次重新加載頁面時都會重新加載style.php

我已經嘗試添加這些緩存頭:

header('Cache-control: must-revalidate'); 
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60 * 60 * 24) . ' GMT'); 

,但沒有運氣。該文件在每次加載頁面時都會加載。什麼是適當的標題爲了強制瀏覽器緩存文件一段時間?

回答

2

如果你希望一個文件被瀏覽器緩存,您應該將Cache-Control頭設置爲public:

header('Cache-control: public'); 

必重新驗證意味着瀏覽器會檢查,如果該文件已被更新,它將調用你的PHP腳本。

+5

根據HTTP/1.1規範,這不是必須-驗證的解釋是: - 它應該只是一個踢緩存的內容已經變得陳舊後(所指示的過期頭部或Cache-Control中的最大年齡值),但是某些瀏覽器似乎忽略了規範併發送請求。然而,'public'並不適用,除非連接被認證。我會使用'Cache-Control:max-age = 86400'來加強Expires頭部中的時間。 – 2010-03-07 08:41:15

+0

@Brock Batsell:感謝您的評論!澄清它,它的工作現在最大年齡= XXXX – Max 2010-03-07 09:11:41

+0

如果文件內容改變,所請求的文件將不會被更新。如果內容改變,OP請求文件不應該被緩存。如果文件內容沒有改變,那麼它應該被緩存。 您提供的代碼打開「緩存」功能。它不能解決OP的問題。 – 2014-12-09 14:30:40

1

此代碼可解決您的問題。

它檢查「最後修改」變量併爲文件分配一個eTag。 如果修改了電子標籤(或文件被修改),則會顯示該文件。否則,會有一個304 HTTP錯誤,指出頁面未被修改。

eTag實際上就是您要找的。

代碼:

<?php 
// Custom variables 
$variables = array('#CCC','#800'); // from db 

// CSS Content 
header('Content-type: text/css'); 

// Last Modified 
$lastModified = filemtime(__FILE__); 

// Get a unique hash of this file (etag) 
$etagFile = md5_file(__FILE__); 

// Get the HTTP_IF_MODIFIED_SINCE header if set 
$ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); 

// Get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash) 
$etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); 

// Set last-modified header 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT"); 

// Set etag-header 
header("Etag: $etagFile"); 

// Make sure caching is turned on 
header('Cache-Control: public'); 

// Check if page has changed. If not, send 304 and exit 
if(@strtotime($ifModifiedSince) == $lastModified || $etagHeader == $etagFile){ 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 
?> 
body {background: <?php echo $variables[0]; ?>;}