Làm thế nào để 304 304 không được sửa đổi chính xác làm việc?


174
  • Các phản hồi "304 không được sửa đổi" được tạo như thế nào?

  • Làm thế nào để trình duyệt xác định xem phản hồi cho yêu cầu HTTP có phải là 304 không?

  • Nó được thiết lập bởi trình duyệt hoặc gửi từ máy chủ?

  • Nếu được gửi bởi máy chủ, làm thế nào để máy chủ biết dữ liệu có sẵn trong bộ đệm, cũng như cách nó đặt 304 thành hình ảnh?

Tôi đoán, nếu nó được tạo bởi trình duyệt:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Tôi đang dựa vào nhà cung cấp API của bên thứ ba để lấy dữ liệu, phân tích và đẩy nó vào cơ sở dữ liệu của tôi. Dữ liệu có thể hoặc không thể thay đổi trong mỗi yêu cầu, nhưng tiêu đề luôn gửi 200. Tôi không muốn phân tích, kiểm tra ID duy nhất cuối cùng trong DB và vv ... để xác định thay đổi dữ liệu, cũng không so sánh trực tiếp kết quả thay vì tôi md5(), sha1()crc32()băm kết quả và hoạt động tốt, nhưng tôi tự hỏi về thuật toán để xác định 304.

Tôi muốn sử dụng cùng loại thuật toán để xác định sự thay đổi trong dữ liệu của mình.


2
Có, tôi đã hiểu được cách 304 không được sửa đổi , nhưng không nhận được câu trả lời nào.
VenomVendor

1
Bạn cần phải chung chung hơn một chút. google.com/search?q=http%20caching
SLaks

Câu trả lời:


200

Khi trình duyệt đặt một cái gì đó vào bộ đệm, nó cũng lưu trữ Last-Modifiedhoặc ETagtiêu đề từ máy chủ.

Trình duyệt sau đó gửi yêu cầu với tiêu đề If-Modified-Sincehoặc If-None-Match, yêu cầu máy chủ gửi 304 nếu nội dung vẫn có ngày đó hoặc ETag.

Máy chủ cần một số cách tính toán ngày sửa đổi hoặc ETag cho từng phiên bản của từng tài nguyên; điều này thường xuất phát từ hệ thống tập tin hoặc một cột cơ sở dữ liệu riêng biệt.


1
ETaglà từ khóa, được kiểm tra với các tiêu đề ETagvẫn giống nhau trong cả hai Response Headers& Response Headers From Cache, bạn có thể cho biết thuật toán phía sau ETag. Tôi đã cập nhật câu hỏi của tôi nêu rõ yêu cầu của tôi.
VenomVendor

4
@VenomVendor: ETagchỉ là một trường trong đó máy chủ có thể lưu trữ một ID duy nhất (thường là số băm hoặc số phiên bản hoặc đồng hồ vector). Nó hoàn toàn không giúp bạn tính được ID đó; đó là tùy thuộc vào mã phía máy chủ của bạn.
SLaks

@SLaks: Điều gì xảy ra nếu trang có cuộc gọi db ... Có khả năng dữ liệu trong db sẽ thay đổi..Trong trường hợp này, việc kiểm tra cuộc gọi được sửa đổi lần cuối là không hợp lý? Làm thế nào để điều kiện này được xem xét?
dùng1050619

3
@ user1050619: Tùy thuộc vào máy chủ của bạn để đảm bảo rằng ETag là chính xác. Nếu bạn hiển thị dữ liệu từ DB, bạn cần bao gồm dữ liệu đó.
SLaks

Một điều vẫn chưa rõ ràng là nếu bạn có số lượng lớn max-agethì trình duyệt có cần thực hiện yêu cầu không? (vì nó có thể vẫn còn trong 304 và không thực hiện yêu cầu nào cả) ... bạn muốn điều này, ví dụ như với tài sản "có dấu vân tay" (chúng vẫn tốt mãi mãi). Khác, quan điểm của max-age...
Andy Hayden

19

Sửa đổi lần cuối: Ngày sửa đổi cuối cùng cho đối tượng được yêu cầu

If-Modified-Because: Cho phép trả về 304 Không sửa đổi nếu ngày sửa đổi cuối cùng không thay đổi.

ETag: ETag là một mã định danh mờ được máy chủ web gán cho một phiên bản cụ thể của tài nguyên được tìm thấy tại một URL. Nếu đại diện tài nguyên tại URL đó thay đổi, một ETag mới và khác được chỉ định.

If-none-Match: Cho phép trả lại 304 Không sửa đổi nếu ETag không thay đổi.

bộ nhớ cache lưu trữ trình duyệt có ngày (Sửa đổi lần cuối) hoặc id (ETag), khi bạn cần yêu cầu lại URL, trình duyệt gửi thông báo yêu cầu với tiêu đề:

nhập mô tả hình ảnh ở đây

máy chủ sẽ trả về 304 khi câu lệnh if sai và trình duyệt sẽ sử dụng bộ đệm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.