2008-10-15 67 views

回答

0

你可以正確使用http響應頭,但它經常被忽略。

否則存儲內容的本地MD5哈希可能對你有用的(除非有,你可以勾了一個更簡單的內容中的字符串)。這並不理想(因爲這是一個相當緩慢的過程),但它是一種選擇。

0

是的,您可以並應該使用HTTP標頭將頁面標記爲未過期。如果它們是動態的(PHP,ASPX等)和/或數據庫驅動,則需要手動控制設置Expires標頭/發送HTTP Not Modified。 ASP.NET有一些SqlDependency對象,但它們仍需要配置和管理。 (不知道PHP有東西只是喜歡它,但可能有一些在PEAR如果不...)

1

這是ETag頭的確切目的,但它必須由你的web框架或支持您需要注意您的應用程序正確響應帶有標題的請求如果 - 匹配,如果不匹配如果 - 範圍(請參閱HTTP Ch 3.11)。

0

Last-Modified頭只會對你有用的,如果該網站的程序員已明確將其歸還。

對於常規的,靜態Last-Modified頁面的HTML文件的最後修改的時間戳。對於動態生成的頁面,服務器無法可靠地分配Last-Modified值,因爲它根本不知道如何根據請求更改內容,所以很多服務器根本不會生成標題。

如果你有在頁面控件,然後確保最後修改頭被設置將確保Last-Modified檢查是成功的。否則,您可能需要獲取頁面,並執行正則表達式來查找更改後的部分(例如新聞網站標題中的日期/時間)。如果沒有這樣明顯的標記存在,那麼我會在頁面內容上第二個Oli's suggestion作爲一種確定它已經改變的方式。

2

即使你可能會認爲這是過時的我總是發現西蒙·威利森對Conditional GET文章比有用的多。這個例子是在PHP中,但它很簡單,你可以適應其他語言。這是例子:

function doConditionalGet($timestamp) { 
    // A PHP implementation of conditional get, see 
    // http://fishbowl.pastiche.org/archives/001132.html 
    $last_modified = substr(date('r', $timestamp), 0, -5).'GMT'; 
    $etag = '"'.md5($last_modified).'"'; 

    // Send the headers 
    header("Last-Modified: $last_modified"); 
    header("ETag: $etag"); 

    // See if the client has provided the required headers 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
     stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 
     false; 

    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
     false; 

    if (!$if_modified_since && !$if_none_match) { 
     return; 
    } 

    // At least one of the headers is there - check them 
    if ($if_none_match && $if_none_match != $etag) { 
     return; // etag is there but doesn't match 
    } 

    if ($if_modified_since && $if_modified_since != $last_modified) { 
     return; // if-modified-since is there but doesn't match 
    } 

    // Nothing has changed since their last request - serve a 304 and exit 
    header('HTTP/1.0 304 Not Modified'); 
    exit; 
} 

有了這個,你可以使用HTTP動詞GETHEAD(我認爲這也可能與others,但我看不到的原因使用它們)。您需要做的只是將If-Modified-SinceIf-None-Match與由頁面的先前版本發送的標頭Last-ModifiedETag的相應值相加。從HTTP 1.1版開始,建議使用ETag而不是Last-Modified,但兩者都會完成這項工作。

這是條件GET如何工作的一個非常簡單的例子。首先,我們需要檢索的頁面通常的方式:

GET /some-page.html HTTP/1.1 
Host: example.org

有條件的標題和內容首度迴應:

200 OK 
ETag: YourETagHere

現在有條件的GET請求:

GET /some-page.html HTTP/1.1 
Host: example.org 
If-None-Match: YourETagHere

和表示響應您可以使用頁面的緩存版本,因爲只有標題即將交付:

304 Not Modified 
ETag: YourETagHere

通過此服務器通知您,頁面沒有修改。

我還可以推薦另一篇關於條件GET的文章:HTTP conditional GET for RSS hackers