2012-09-19 38 views
1

想象一下,您的服務器不支持Apache上的deflate和gzip模塊。在這種情況下,有幾種方法可以壓縮數據。假設您的服務器不支持Apache上的deflate和gzip模塊,請使用Apache&PHP gzip強制瀏覽器緩存css和js文件

我使用Apache重寫模塊和php gzip擴展來做到這一點。

我創建了一個名爲gzip.php的文件來獲取$ _SERVER ['REQUEST_URI'],獲取它的內容,設置標題,壓縮和刷新內容作爲文件。

我保留所有文件的擴展名,以便apache保留文件類型。

我添加了這些行的.htaccess:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -s 
RewriteRule ^((.*)\.(js|css))$ gzip.php [L] 

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ index.php [NC,L] 

我已經添加了這些頭我的文件:

$src = $_SERVER['REQUEST_URI']; 

// seconds, minutes, hours, days 
$expires = 60*60*24*14; 

ob_start(); 
ob_implicit_flush(0); 

header("Pragma: public"); 
header("Cache-Control: maxage=".$expires); 
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT'); 

// Then do everything you want to do on the page 
$path = PUBLIC_DIR . $src; 
$info = pathinfo($path); 
$ext = strtolower($info['extension']); 
include_once 'Entezar/File.php'; 
$mimeType = Entezar_File::getMimeType($path); 
header("Content-type: $mimeType"); 

if (file_exists($path) && in_array($ext, array('js', 'css'))) { 
    $fs = stat($path); 
    header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'],  $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16))); 
    echo file_get_contents($path); 
} 
unset($path, $src, $info, $ext); 

我的問題是,當我使用Apache重寫模塊一起使用PHP來壓縮內容,FireFox根本不會從緩存中加載我的文件(css或js)! 任何人都可以幫助我嗎?!

+0

你在瀏覽器中測試服務器的響應頭?響應標題是否正確?響應主體是否包含與您期望它們相同的內容? – farzad

+0

感謝Farzad,目前問題已解決!我自己回答了!哦,快樂Zend2你! –

回答

4

Digger's Finder! 在做任何工作(壓縮gzip.php文件中的一些文件)之前,您應該檢查$ _SERVER變量中的這兩個鍵(當然,您應該在某處設置過期和緩存標頭,例如apache .htaccess文件或其他地方...) :

$etag = '"' . md5($contents) . '"'; 
$etag_header = 'Etag: ' . $etag; 
header($etag_header); 

if (isset($_SERVER['HTTP_IF_NONE_MATCH']) and $_SERVER['HTTP_IF_NONE_MATCH']==$etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit(); 
} 

在Apache中的.htaccess加上這些行:

<ifModule mod_expires.c> 
    ExpiresActive On 
    ExpiresDefault "access plus 1 seconds" 
    ExpiresByType text/html "access plus 1 seconds" 
    ExpiresByType image/gif "access plus 2592000 seconds" 
    ExpiresByType image/jpeg "access plus 2592000 seconds" 
    ExpiresByType image/png "access plus 2592000 seconds" 
    ExpiresByType text/css "access plus 604800 seconds" 
    ExpiresByType text/javascript "access plus 216000 seconds" 
    ExpiresByType application/x-javascript "access plus 216000 seconds" 
</ifModule> 

<ifModule mod_headers.c> 

    <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$"> 
    Header set Cache-Control "max-age=2592000, public" 
    </filesMatch> 
    <filesMatch "\\.(css)$"> 
    Header set Cache-Control "max-age=604800, public" 
    </filesMatch> 
    <filesMatch "\\.(js)$"> 
    Header set Cache-Control "max-age=216000, private" 
    </filesMatch> 
    <filesMatch "\\.(xml|txt)$"> 
    Header set Cache-Control "max-age=216000, public, must-revalidate" 
    </filesMatch> 
    <filesMatch "\\.(html|htm|php)$"> 
    Header set Cache-Control "max-age=1, private, must-revalidate" 
    </filesMatch> 
</ifModule> 
相關問題