bạn có thể yêu cầu tiêu đề http để kiểm tra xem trang web đã được chỉnh sửa hay chưa bằng cách xem ngày của trang đó, nhưng về các trang động như - php, aspx - lấy dữ liệu của nó từ cơ sở dữ liệu?Tôi có thể sử dụng "tiêu đề http" để kiểm tra xem trang động đã được thay đổi chưa
Trả lời
Bạn có thể sử dụng tiêu đề phản hồi http một cách chính xác nhưng thường bị bỏ qua.
Nếu không, lưu trữ md5-băm cục bộ của nội dung có thể hữu ích cho bạn (trừ khi có chuỗi nội dung dễ dàng hơn bạn có thể móc ra). Nó không lý tưởng (vì nó là một quá trình khá chậm) nhưng đó là một lựa chọn.
Có, bạn có thể và nên sử dụng tiêu đề HTTP để đánh dấu các trang là chưa hết hạn. Nếu chúng là động mặc dù (PHP, ASPX, vv) và/hoặc cơ sở dữ liệu điều khiển, bạn sẽ cần phải tự kiểm soát thiết lập các tiêu đề hết hạn/gửi HTTP không sửa đổi một cách thích hợp. ASP.NET có một số đối tượng SqlDependency cho điều này, nhưng chúng vẫn cần phải được cấu hình và quản lý. (Không chắc liệu PHP có gì đó giống như nó không, nhưng có lẽ có gì đó trong PEAR nếu không ...)
Đây là mục đích chính xác của tiêu đề ETag, nhưng nó phải được khung web của bạn hỗ trợ hoặc bạn cần lưu ý rằng ứng dụng của bạn phản hồi đúng yêu cầu với tiêu đề Nếu so khớp, Nếu không khớp và Nếu phạm vi (xem HTTP Ch 3.11).
Tiêu đề Last-Modified
sẽ chỉ được sử dụng cho bạn nếu người lập trình trang web đã đặt rõ ràng tiêu đề để được trả lại.
Đối với trang tĩnh, thông thường Last-Modified
là dấu thời gian của sửa đổi cuối cùng của tệp HTML. Đối với một trang được tạo động, máy chủ không thể gán giá trị Last-Modified
một cách đáng tin cậy vì nó không có cách nào thực sự biết được nội dung đã thay đổi như thế nào tùy theo yêu cầu, vì vậy nhiều máy chủ không tạo tiêu đề.
Nếu bạn có quyền kiểm soát trang, sau đó đảm bảo tiêu đề Sửa đổi lần cuối được đặt sẽ đảm bảo séc trên Last-Modified
thành công. Nếu không, bạn có thể phải tìm nạp trang và thực hiện regex để tìm phần đã thay đổi (ví dụ: ngày/giờ trong tiêu đề của trang web tin tức). Nếu không có dấu hiệu rõ ràng như vậy tồn tại, sau đó tôi muốn số thứ hai Oli's suggestion của MD5 trên nội dung trang như một cách để chắc chắn rằng nó đã thay đổi.
Mặc dù bạn có thể nghĩ rằng nó đã lỗi thời, tôi luôn tìm thấy bài viết của Simon Willison trên Conditional GET để hữu ích hơn. Ví dụ là trong PHP nhưng nó đơn giản đến nỗi bạn có thể thích nghi nó với các ngôn ngữ khác. Dưới đây là ví dụ:
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;
}
Với điều này bạn có thể sử dụng động từ HTTP GET hoặc HEAD (Tôi nghĩ rằng nó cũng có thể với others, nhưng tôi không thể nhìn thấy lý do để sử dụng chúng). Tất cả những gì bạn cần làm là thêm If-Modified-Since
hoặc If-None-Match
với các giá trị tương ứng của tiêu đề Last-Modified
hoặc ETag
được gửi bởi phiên bản trước của trang. Kể từ phiên bản HTTP 1.1, bạn nên sử dụng ETag
trên Last-Modified
, nhưng cả hai đều sẽ thực hiện công việc.
Đây là một ví dụ rất đơn giản về cách thức hoạt động của GET có điều kiện.Đầu tiên chúng ta cần phải lấy trang theo cách thông thường:
GET /some-page.html HTTP/1.1 Host: example.org
phản ứng đầu tiên với tiêu đề có điều kiện và nội dung:
200 OK ETag: YourETagHere
Bây giờ get có điều kiện yêu cầu:
GET /some-page.html HTTP/1.1 Host: example.org If-None-Match: YourETagHere
Và câu trả lời cho thấy bạn có thể sử dụng phiên bản được lưu trong bộ nhớ cache của trang, vì chỉ các tiêu đề sẽ được phân phối:
304 Not Modified ETag: YourETagHere
Với điều này, máy chủ thông báo cho bạn rằng không có sửa đổi nào đối với trang.
Tôi cũng có thể giới thiệu cho bạn một bài viết khác về GET có điều kiện: HTTP conditional GET for RSS hackers.
- 1. Tôi có thể sử dụng JS hoặc jQuery để kiểm tra xem hình ảnh SVG đã được tải chưa?
- 2. NHibernate có thể kiểm tra xem lược đồ db đã được tạo chưa?
- 3. Cách kiểm tra xem WaitHandle đã được đặt chưa?
- 4. Kiểm tra xem e-mail đã được nhập đúng chưa
- 5. tập lệnh đơn giản để kiểm tra xem trang web đã được cập nhật chưa
- 6. Kiểm tra xem hằng số đã được xác định chưa
- 7. Kiểm tra xem giá trị nguyên đã tăng chưa?
- 8. Làm cách nào để bạn kiểm tra/thay đổi mã chưa được kiểm tra và không thể kiểm tra?
- 9. Kiểm tra xem 'Truy cập vào vị trí của tôi' đã được bật chưa - Android
- 10. Kiểm tra xem bộ chuyển đổi đã được đăng ký chưa
- 11. Cách kiểm tra xem segue nào đã được sử dụng
- 12. Làm thế nào để kiểm tra xem hình ảnh đã được tải bằng Javascript chưa?
- 13. Tôi có thể thay đổi tiêu đề của yêu cầu HTTP được gửi bởi trình duyệt không?
- 14. Làm cách nào để kiểm tra xem CGPoint đã được khởi tạo chưa?
- 15. Làm cách nào để kiểm tra xem máy quét đã được cắm chưa (C#, .NET TWAIN)
- 16. Kohana: Có cần kiểm tra xem SYSPATH đã được xác định chưa?
- 17. Kiểm tra xem một cửa hàng (hoặc hồ sơ) đã được chỉnh sửa chưa?
- 18. Cách kiểm tra xem tài liệu đã sẵn sàng chưa?
- 19. Làm thế nào để kiểm tra xem tôi đã đạt đến cuối chuỗi trong Java chưa?
- 20. Làm cách nào để kiểm tra xem biến đã được khởi tạo chưa
- 21. kiểm tra xem tải xuống đã hoàn tất chưa
- 22. Cách kiểm tra Backbone.history đã được bắt đầu chưa?
- 23. Làm thế nào để kiểm tra xem một nguồn cấp dữ liệu RSS đã được cập nhật bằng Python chưa?
- 24. Làm thế nào để kiểm tra xem tai nghe đã được cắm vào hay chưa?
- 25. Thuật toán nào nhanh hơn để kiểm tra xem một bit đã được đặt chưa?
- 26. Làm cách nào để kiểm tra xem thiết bị USB đã được cắm chưa?
- 27. Kiểm tra Solidworks đã được cài đặt chưa?
- 28. Làm cách nào để kiểm tra xem jQuery đã có trong bộ nhớ cache chưa?
- 29. Kiểm tra xem một trang tab cụ thể có được chọn (hoạt động)
- 30. Kiểm tra nếu hộp kiểm đã được kiểm tra trên tải sử dụng jQuery
Có bất kỳ giải pháp được đề xuất nào phù hợp với bạn không? –