可以請求的HTTP標頭檢查網頁已通過查看它的日期,但如何對動態頁面,如編輯 - PHP,ASPX - 從數據庫中獲取數據?我可以利用「HTTP標頭」檢查一個動態頁面已被更改
回答
你可以正確使用http響應頭,但它經常被忽略。
否則存儲內容的本地MD5哈希可能對你有用的(除非有,你可以勾了一個更簡單的內容中的字符串)。這並不理想(因爲這是一個相當緩慢的過程),但它是一種選擇。
是的,您可以並應該使用HTTP標頭將頁面標記爲未過期。如果它們是動態的(PHP,ASPX等)和/或數據庫驅動,則需要手動控制設置Expires標頭/發送HTTP Not Modified。 ASP.NET有一些SqlDependency對象,但它們仍需要配置和管理。 (不知道PHP有東西只是喜歡它,但可能有一些在PEAR如果不...)
這是ETag頭的確切目的,但它必須由你的web框架或支持您需要注意您的應用程序正確響應帶有標題的請求如果 - 匹配,如果不匹配和如果 - 範圍(請參閱HTTP Ch 3.11)。
的Last-Modified
頭只會對你有用的,如果該網站的程序員已明確將其歸還。
對於常規的,靜態Last-Modified
頁面的HTML文件的最後修改的時間戳。對於動態生成的頁面,服務器無法可靠地分配Last-Modified
值,因爲它根本不知道如何根據請求更改內容,所以很多服務器根本不會生成標題。
如果你有在頁面控件,然後確保最後修改頭被設置將確保Last-Modified
檢查是成功的。否則,您可能需要獲取頁面,並執行正則表達式來查找更改後的部分(例如新聞網站標題中的日期/時間)。如果沒有這樣明顯的標記存在,那麼我會在頁面內容上第二個Oli's suggestion作爲一種確定它已經改變的方式。
即使你可能會認爲這是過時的我總是發現西蒙·威利森對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動詞GET或HEAD(我認爲這也可能與others,但我看不到的原因使用它們)。您需要做的只是將If-Modified-Since
或If-None-Match
與由頁面的先前版本發送的標頭Last-Modified
或ETag
的相應值相加。從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。
- 1. 我可以使用Spring Security @PreAuthorize檢查HTTP標頭嗎?
- 2. HTTP標頭沒有被更改:yii2
- 3. 無法檢索一個頁面的完整http標頭
- 4. 用於緩存動態頁面的Http標頭
- 5. 可見頁面上的HTTP標頭404
- 6. 我可以檢查prePersist()中的值是否已更改?
- 7. 動態更改頁面
- 8. 檢查是否已經定義了某個HTTP標頭
- 9. 檢測頁面已被訪問更改圖像
- 10. 更改http請求標頭
- 11. 我是否可以動態更改頁面佈局以適應窗口大小?
- 12. 檢測頁面更改爲一個頁面應用程序JS
- 13. 您正在查找的頁面可能已被刪除名稱已更改或暫時不可用
- 14. 我可以動態更改嵌套母版頁的母版嗎?
- 15. 我可以創建一個原型頁面,然後用PHP更改它?
- 16. Swift 2更改前檢查頁面
- 17. 服務器無法HTTP標頭後清晰頭已被送往
- 18. 檢查網頁是否被修改/已過期用Ruby
- 19. .ASPX已更改檢查
- 20. HTTP頭可以被本地化嗎?
- 21. 是否可以在YUI分頁數據表中動態更改頁面大小?
- 22. 我可以禁用滾動一個ASP.net頁面嗎?
- 23. 哪個checkbutton已被檢查
- 24. 如何動態更改頁面模板
- 25. ASP.NET動態更改主頁面
- 26. ASPxGridview動態更改頁面大小
- 27. Omniture:動態更改頁面名稱
- 28. 我可以檢查我的Cookie以決定在RegisterRoutes中加載哪個頁面
- 29. CheckBoxFor,當我重新加載頁面,我可以檢查已經檢查複選框
- 30. JSF + RichFaces給了我一個HTTP狀態404在我的頁面
建議的解決方案是否適合您? – 2009-01-10 13:44:08