主要涉及到 Header 裡面三個屬性
lastModified:設定一個最後修改時間,瀏覽器下次訪問的時候,發送一個”If-Modified-Sinc”的頭資訊,如果內容在這個時間之後沒有更新,伺服器直接返回一個304 Not Modified而不傳輸詳細內容,可以節省頻寬。
Etag:設定一個標記,瀏覽器下次訪問時,發送一個”If-None-Match”的頭資訊,如果伺服器內容還是這個標記沒變,也直接返回一個304 Not Modified而不傳輸詳細內容,同樣可以節省頻寬。
Expires:設定一個到期時間,如果當前請求在這個到期時間之類,則不發送HTTP請求,不僅可以節約伺服器頻寬,還可以減少伺服器HTTP請求數。
Cache-control: max-age=seconds 緩衝相對時間 seconds 是緩衝的秒數 即第一次訪問後 多少秒之內再訪問直接存取的時候瀏覽器本機快取 不會訪問伺服器
過程如下:
1.用戶端請求一個頁面(A)。
2.伺服器返回頁面A,並在給A加上一個Last-Modified/ETag。
3.用戶端展現該頁面,並將頁面連同Last-Modified/ETag一起緩衝。
4.客戶再次請求頁面A,並將上次請求時伺服器返回的Last-Modified/ETag一起傳遞給伺服器。
5.伺服器檢查該Last-Modified或ETag,並判斷出該頁面自上次用戶端請求之後還未被修改,直接返迴響應304和一個空的響應體。
相關函數
//http header 狀態代碼 和 對應描述
$statusTexts = array(
'100' => 'Continue',
'101' => 'Switching Protocols',
'200' => 'OK',
'201' => 'Created',
'202' => 'Accepted',
'203' => 'Non-Authoritative Information',
'204' => 'No Content',
'205' => 'Reset Content',
'206' => 'Partial Content',
'300' => 'Multiple Choices',
'301' => 'Moved Permanently',
'302' => 'Found',
'303' => 'See Other',
'304' => 'Not Modified',
'305' => 'Use Proxy',
'306' => '(Unused)',
'307' => 'Temporary Redirect',
'400' => 'Bad Request',
'401' => 'Unauthorized',
'402' => 'Payment Required',
'403' => 'Forbidden',
'404' => 'Not Found',
'405' => 'Method Not Allowed',
'406' => 'Not Acceptable',
'407' => 'Proxy Authentication Required',
'408' => 'Request Timeout',
'409' => 'Conflict',
'410' => 'Gone',
'411' => 'Length Required',
'412' => 'Precondition Failed',
'413' => 'Request Entity Too Large',
'414' => 'Request-URI Too Long',
'415' => 'Unsupported Media Type',
'416' => 'Requested Range Not Satisfiable',
'417' => 'Expectation Failed',
'500' => 'Internal Server Error',
'501' => 'Not Implemented',
'502' => 'Bad Gateway',
'503' => 'Service Unavailable',
'504' => 'Gateway Timeout',
'505' => 'HTTP Version Not Supported',
);
//設定緩衝到期時間
function expires($seconds = 1800)
{
$time = date('D, d M Y H:i:s', time() + $seconds) . ' GMT';
header("Expires: $time");
}
//返回指定header狀態資訊
function statusCode($code, $text = null)
{
global $statusTexts;//http header 狀態
$protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
$text = (null === $text) ? $statusTexts[$code] : $text;
$status = "$protocol $code $text";
header($status);
}
//lastModified
function lastModified($modifiedTime, $notModifiedExit = true)
{
$modifiedTime = date('D, d M Y H:i:s \G\M\T', $modifiedTime);
if ($notModifiedExit && isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $modifiedTime == $_SERVER['HTTP_IF_MODIFIED_SINCE']) {
statusCode('304');
exit();
}
header("Last-Modified: $modifiedTime");
}
//設定頁面charest
function charset($enc = 'UTF-8', $type = 'text/html')
{
header("Content-Type:$type;charset=$enc");
}
//禁止瀏覽器快取頁面面
function disableBrowserCache()
{
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
}
//etag 設定內容標記 etag 多用 md5(要輸出的內容)
function etag($etag, $notModifiedExit = true)
{
if ($notModifiedExit && isset($_SERVER['HTTP_IF_NONE_MATCH']) && $etag == $_SERVER['HTTP_IF_NONE_MATCH']) {
statusCode('304');
exit();
}
header("Etag: $etag");
}
http://hi.baidu.com/tenyaoshen/item/f7c99b4a86bba6e01281da0b