304 — Nội dung không thay đổi
HTTP 304 Not Modified là gì, vì sao đây là mã 3xx nhưng không phải chuyển hướng, cách ETag và Last-Modified vận hành, cùng lợi ích gián tiếp cho hiệu quả crawl trên site lớn mà không ảnh hưởng thứ hạng.
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này
- Công cụ trực tuyến liên quanHTTP Header Checker
HTTP 304 Not Modified là phản hồi cho yêu cầu GET hoặc HEAD có điều kiện khi điều kiện được đánh giá false và nếu không có điều kiện sẽ nhận 200. Đây là phản hồi lớp 3xx nhưng không phải chuyển hướng: không có header Location và theo đặc tả hoàn toàn không có body. GET/HEAD mang If-None-Match để so với ETag hoặc If-Modified-Since để so với Last-Modified chính là yêu cầu có điều kiện; lần truy cập thứ hai chỉ là ví dụ thường gặp, không phải quy tắc giao thức. Khi validator còn khớp, máy chủ trả 304 không body và client dùng bản cache. SEO không có tác động trực tiếp đến thứ hạng; Google đã có nội dung và 304 chỉ xác nhận chưa đổi, dù Search có thể tính lại tín hiệu URL. Trên site lớn có nhiều URL ít thay đổi, 304 tiết kiệm băng thông và khả năng tính toán, điều Google nói có thể gián tiếp cải thiện hiệu quả crawl nhưng không bảo đảm tự động phân bổ crawl budget sang URL khác. Google khuyên ưu tiên ETag vì không có cạm bẫy định dạng ngày, đồng thời hỗ trợ đặt cả hai validator. Chỉ làm cache mất hiệu lực khi nội dung thật sự thay đổi đáng kể, không phải chỉ đổi năm bản quyền ở footer. Đừng nhầm 304 với 301/302/307/308 đưa client sang URL khác hoặc 204 No Content cũng không body nhưng vì thật sự không có gì để gửi.
Tóm tắt — Phản hồi 304 Not Modified là cách máy chủ nói “bạn đã có tài nguyên này; bản sao vẫn còn hiệu lực nên không cần tải lại”. Đây không phải lỗi và dù thuộc họ 3xx thường gọi là “chuyển hướng”, nó không đưa ai đến URL mới. 304 chỉ xuất hiện khi client, như trình duyệt hoặc crawler, gửi yêu cầu có điều kiện hỏi tài nguyên có thay đổi từ lần trước hay không. Nó không trực tiếp thay đổi thứ hạng SEO, nhưng trên site lớn có thể giúp công cụ tìm kiếm dùng tài nguyên hiệu quả hơn.
304 thực sự là gì
Mọi phản hồi của máy chủ bắt đầu bằng mã trạng thái ba chữ số. 200 OK nghĩa là máy chủ gửi đầy đủ trang và body. 304 Not Modified cụ thể hơn: client đã gửi yêu cầu có điều kiện, tức “chỉ gửi trang nếu nó thay đổi”, và máy chủ xác định điều kiện không thỏa vì nội dung chưa đổi. Thay vì 200, máy chủ trả 304 không có body. Quy tắc chính xác là 304 chỉ có thể trả lời một yêu cầu GET/HEAD có điều kiện mà điều kiện được đánh giá là false. Evidence for this claim A 304 is sent in response to a conditional GET or HEAD when the condition evaluates false and the response otherwise would have been 200 OK. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified
Lần truy cập thứ hai là ví dụ thường gặp. Lần đầu, trình duyệt hoặc crawler nhận 200 với toàn bộ nội dung và một số header đóng vai trò “dấu vân tay”. Lần sau, client gửi dấu đó và hỏi nội dung có còn như cũ không. Nếu chưa đổi, máy chủ trả 304 không có body và client dùng lại bản sao đã lưu. Tuy nhiên, “lần truy cập thứ hai” chỉ là ví dụ giảng giải; điều thật sự kích hoạt 304 là yêu cầu có điều kiện, bất kể nó xuất hiện bằng cách nào. Evidence for this claim RFC 9110 defines 304 Not Modified as the response to a conditional GET or HEAD when the selected representation has not changed and says the response cannot contain content. Scope: HTTP semantics for 304 conditional responses. Confidence: high · Verified: IETF: RFC 9110 §15.4.5 — 304 Not Modified
Vì sao thuộc họ “chuyển hướng” nhưng không phải chuyển hướng
304 bắt đầu bằng số 3, lớp HTTP thường dành cho chuyển hướng, nên dễ gây nhầm. Nhưng 304 không có header Location và không đưa client sang địa chỉ khác. Nó chỉ yêu cầu client quay lại bản sao đã lưu trong cache. “Họ chuyển hướng” ở đây là đặc điểm đánh số, không phải chức năng thực tế.
304 có phải vấn đề không?
Không. Thấy 304 trong bảng Network của trình duyệt hoặc báo cáo crawl thường cho biết cache đang hoạt động đúng như mong muốn. Nhiều bài “lỗi 304, cách sửa” coi nó như hỏng hóc phía bạn, nhưng đây là kết quả đúng và có chủ ý của một cache vận hành tốt.
304 có giúp SEO không?
Không trực tiếp giúp thứ hạng. Google đã có nội dung từ lần crawl trước; 304 chỉ xác nhận nội dung chưa đổi để Google tiếp tục dùng bản đã lưu. Search vẫn có thể tính lại tín hiệu của URL, nhưng bản thân 304 không mang lại lợi thế xếp hạng hay lập chỉ mục. Lợi ích thật là hiệu quả tài nguyên: không phải tải lại trang chưa đổi giúp công cụ tìm kiếm, máy chủ và mạng tiết kiệm băng thông cùng khả năng tính toán. Google nói điều này có thể gián tiếp giúp crawl hiệu quả hơn, chứ không bảo đảm tài nguyên tiết kiệm được tự động chuyển sang URL mới hoặc đã cập nhật. Lợi ích rõ nhất ở site lớn có nhiều trang ít thay đổi. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation
Muốn hiểu cơ chế ETag, If-None-Match, validator mạnh/yếu, cách triển khai và phát biểu thực tế của Google? Hãy chuyển sang thẻ Nâng cao.
Tóm tắt — 304 là phản hồi cho yêu cầu
GET/HEADcó điều kiện khi điều kiện được đánh giá false và nếu không có điều kiện thì sẽ nhận200(RFC 9110 §15.4.5). Nó thuộc lớp 3xx nhưng không phải chuyển hướng: khôngLocation, không URL mới và theo quy chuẩn không có body — “it cannot contain content or trailers” (bản dịch) «không được chứa nội dung hoặc trailer». Điều kiện đi quaIf-None-Matchso vớiETagvà/hoặcIf-Modified-Sinceso vớiLast-Modified; nếu validator còn khớp, máy chủ trả 304 và client dùng lại cache. SEO: không có tác động trực tiếp đến thứ hạng; Google đã có nội dung dù Search vẫn có thể tính lại tín hiệu URL. Trên site lớn, tiết kiệm tài nguyên có thể gián tiếp cải thiện hiệu quả crawl, nhưng Google không hứa tự động phân bổ crawl budget sang URL khác. Hạ tầng crawl Google hỗ trợ cả hai validator và khuyên ưu tiênETagvì tránh lỗi định dạng ngày. Đừng nhầm 304 với 301/302/307/308 chuyển URL hoặc 204 không có body vì thật sự không có gì để gửi.
Ý nghĩa của 304 trong đặc tả
RFC 9110 (HTTP Semantics) §15.4.5 định nghĩa chính xác: “The 304 (Not Modified) status code indicates that a conditional GET or HEAD request has been received and would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false.” (bản dịch) «Mã 304 cho biết đã nhận yêu cầu GET hoặc HEAD có điều kiện; nếu điều kiện không được đánh giá là false thì yêu cầu đó sẽ dẫn đến phản hồi 200.» Đây là tác nhân mang tính quy chuẩn. Nói đơn giản, client hỏi “chỉ gửi trang nếu nó đổi”, máy chủ xác định chưa đổi nên bỏ qua body. “Lần truy cập thứ hai” là ví dụ thường ngày về cách yêu cầu trở thành có điều kiện, không phải yêu cầu của giao thức; đặc tả chỉ đòi hỏi yêu cầu có điều kiện. Evidence for this claim RFC 9110 defines 304 Not Modified as the response to a conditional GET or HEAD when the selected representation has not changed and says the response cannot contain content. Scope: HTTP semantics for 304 conditional responses. Confidence: high · Verified: IETF: RFC 9110 §15.4.5 — 304 Not Modified
Đặc tả thậm chí dùng từ “redirecting”: “the server is therefore redirecting the client to make use of that stored representation as if it were the content of a 200 (OK) response” (bản dịch) «máy chủ hướng client dùng biểu diễn đã lưu như thể đó là nội dung của phản hồi 200». Hãy đọc kỹ: client được hướng về cache của chính nó, không phải URL khác. Không có header Location hay địa chỉ mới. Câu này là nguồn của phần lớn nhầm lẫn rằng 304 là chuyển hướng; theo nghĩa HTTP, nó không phải.
Hai điểm quy chuẩn khác cũng quan trọng:
- Không bao giờ có body. RFC 9110 viết: “A 304 response is terminated by the end of the header section; it cannot contain content or trailers.” (bản dịch) «Phản hồi 304 kết thúc ở cuối phần header; nó không được chứa nội dung hoặc trailer.» 304 có body vi phạm đặc tả và một số client sẽ xử lý sai. Đây là quy tắc bắt buộc.
- Mang cùng metadata mà 200 sẽ gửi. Máy chủ “MUST generate any of the following header fields that would have been sent in a 200 (OK) response to the same request: Content-Location, Date, ETag, and Vary” (bản dịch) «PHẢI tạo các trường header tương ứng vốn sẽ được gửi trong phản hồi 200 cho cùng yêu cầu: Content-Location, Date, ETag và Vary», cùng
Cache-ControlvàExpireskhi áp dụng. Có thể hiểu 304 là các header của 200 không kèm payload. Evidence for this claim A 304 response terminates after the header section and cannot contain content or trailers. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified
304 hoạt động thế nào: yêu cầu có điều kiện
Máy chủ không tự nhiên gửi 304. Nó luôn trả lời một yêu cầu có điều kiện, tức yêu cầu mà client gắn một validator đã lưu từ phản hồi trước. Có hai loại validator.
ETag và If-None-Match
ETag (entity tag) là token opaque mà máy chủ gắn vào phản hồi 200; hãy coi nó như dấu vân tay phiên bản của đúng biểu diễn URL đó. Trong yêu cầu tiếp theo, client gửi lại giá trị bằng header If-None-Match. Nếu ETag hiện tại vẫn khớp, nội dung chưa đổi và máy chủ trả 304; nếu khác, máy chủ trả 200 mới với nội dung và ETag mới.
Last-Modified và If-Modified-Since
Phương án dựa trên ngày: máy chủ gửi timestamp Last-Modified trong phản hồi 200. Lần sau client gửi lại bằng If-Modified-Since; nếu tài nguyên chưa thay đổi kể từ mốc đó, kết quả là 304. Cách này đơn giản nhưng kém chi tiết hơn và nhạy với định dạng HTTP-date chính xác, một nguồn lỗi phổ biến. Khi có cả hai validator, If-None-Match (ETag) được ưu tiên hơn If-Modified-Since.
ETag mạnh và yếu
ETag có thể mạnh hoặc yếu. Theo hướng dẫn yêu cầu có điều kiện của MDN, “strong validation consists of guaranteeing that the resource is, byte to byte, identical to the one it is compared to.” (bản dịch) «xác thực mạnh bảo đảm tài nguyên giống hệt từng byte với tài nguyên được so sánh». ETag yếu có tiền tố W/, ví dụ ETag: W/"abc123", và chỉ khẳng định tương đương ngữ nghĩa. Ví dụ của MDN coi hai trang chỉ khác ngày ở footer hoặc quảng cáo là giống nhau theo xác thực yếu. ETag mạnh không có tiền tố và cần cho range request đòi hỏi khớp byte chính xác; ETag yếu hữu ích khi nén, khoảng trắng hoặc khác biệt vụn vặt không nên buộc tải lại toàn bộ. Cạm bẫy thực tế là ETag đổi mỗi lần nén gzip/Brotli hoặc khác giữa các máy chủ cân bằng tải sẽ gây crawl lại không cần thiết. Hãy chủ ý chọn loại validator và giữ ổn định khi nội dung thật sự không đổi.
Toàn bộ quá trình bắt tay
- Yêu cầu đầu → máy chủ trả
200 OKvới nội dung cùngETagvà/hoặcLast-Modified. - Client lưu nội dung và validator.
- Yêu cầu sau → client gửi
If-None-Matchvà/hoặcIf-Modified-Sincevới giá trị đã lưu. - Máy chủ quyết định: chưa đổi →
304 Not Modified, không body, client dùng cache; đã đổi →200 OKvới body và validator mới. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation
Nếu cần phân tích sâu hơn về cache và validator như đòn bẩy hiệu quả crawl, gồm toàn bộ câu chuyện yêu cầu có điều kiện và quan hệ với crawl budget, hãy xem chủ đề đi kèm; bài này tập trung vào mã trạng thái.
304 và SEO: không ảnh hưởng thứ hạng, có lợi cho hiệu quả crawl
Câu chuyện SEO hẹp hơn nhiều nội dung chung trên blog. 304 không có tác động trực tiếp đến thứ hạng; hướng dẫn của Google cũng giới hạn tác động lập chỉ mục: Search có thể vẫn tính lại tín hiệu của URL, nhưng ngoài điều đó 304 không thay đổi cách trang được lập chỉ mục. Google đã có nội dung từ lần crawl trước; 304 chỉ xác nhận chưa đổi. Không có phần thưởng xếp hạng cho việc trả 304.
Lợi ích của 304 là tiết kiệm tài nguyên, từ đó có thể gián tiếp cải thiện hiệu quả crawl. Trong bài Search Central tháng 12/2024 về HTTP caching, Gary Illyes viết: “Especially if you have a large site with rarely-changing content under individual URLs, allowing caching locally may help your site be crawled more efficiently. Google’s crawling infrastructure supports heuristic HTTP caching as defined by the HTTP caching standard, specifically through the ETag response- and If-None-Match request header, and the Last-Modified response- and If-Modified-Since request header.” (bản dịch) «Đặc biệt với site lớn có nội dung hiếm thay đổi ở từng URL, cho phép cache cục bộ có thể giúp site được crawl hiệu quả hơn. Hạ tầng crawl của Google hỗ trợ HTTP caching suy đoán theo tiêu chuẩn, cụ thể qua ETag/If-None-Match và Last-Modified/If-Modified-Since.»
Về cơ chế 304, cùng bài viết giải thích vì sao body rỗng là trọng tâm: nếu ETag crawler gửi “matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body” (bản dịch) «khớp giá trị hiện tại do máy chủ tạo, máy chủ nên trả HTTP 304 không có body». Không tạo và truyền body giúp tiết kiệm tính toán cùng băng thông ở cả hai phía. Google dùng ngôn ngữ có điều kiện: tiết kiệm đó có thể gián tiếp cải thiện hiệu quả crawl. Đây không phải lời hứa rằng công sức tiết kiệm được sẽ tự động chuyển sang URL mới hay đã cập nhật.
Vì sao site lớn hưởng lợi hơn
Với vài trăm trang, lợi ích phần lớn mang tính học thuật vì Google có thể crawl toàn site dễ dàng. Giá trị tăng theo quy mô: site có hàng trăm nghìn hoặc hàng triệu URL, nhiều URL hiếm thay đổi, hưởng lợi đáng kể khi crawler bỏ qua việc tải lại nội dung cũ. Đó là đối tượng bài Google nhắm đến; đừng quảng bá quá mức 304 như chiến thuật cho site nhỏ.
Chọn ETag hay Last-Modified và thế nào là “đã đổi”
Google khuyên dùng ETag làm validator chính: “We strongly recommend using ETag because it’s less prone to errors and mistakes (the value is not structured unlike the Last-Modified value).” (bản dịch) «Chúng tôi đặc biệt khuyên dùng ETag vì ít dễ mắc lỗi hơn; giá trị không có cấu trúc như Last-Modified.» Có thể và nên đặt cả hai. Nếu dùng Last-Modified, ngày “must be formatted according to the HTTP standard” (bản dịch) «phải được định dạng theo tiêu chuẩn HTTP». Google đề xuất mẫu “Weekday, DD Mon YYYY HH:MM:SS Timezone,” (bản dịch) «Thứ, ngày tháng năm giờ:phút:giây múi giờ», ví dụ “Fri, 4 Sep 1998 19:15:56 GMT”, nếu không header có thể bị bỏ qua. Google cũng gợi ý đặt max-age của Cache-Control để giúp crawler quyết định thời điểm crawl lại. Evidence for this claim Google's crawler guidance recommends ETag because its opaque value avoids date-formatting errors, while also allowing both ETag and Last-Modified; this is Google-specific operational advice, not a change to HTTP validator semantics. Scope: HTTP cache validation Confidence: high · Verified: Crawling December: HTTP caching
Bạn quyết định thay đổi nào đáng làm cache mất hiệu lực. Google khuyên chỉ làm mới khi nội dung thay đổi đáng kể: “Our recommendation is that you require a cache refresh on significant changes to your content; if you only updated the copyright date at the bottom of your page, that’s probably not significant.” (bản dịch) «Hãy yêu cầu làm mới cache khi nội dung thay đổi đáng kể; nếu chỉ cập nhật ngày bản quyền ở cuối trang thì có lẽ chưa đáng kể.»
Googlebot và Bingbot thực sự làm gì
Không phải mọi yêu cầu crawler đều có điều kiện. Tài liệu crawler Google nói mức hỗ trợ cache khác nhau theo crawler và sản phẩm: Googlebot hỗ trợ cache khi crawl lại URL cho Search, còn một số fetcher khác chỉ hỗ trợ trong điều kiện nhất định. Vì vậy, dù header đúng, đừng mong 100% yêu cầu có If-None-Match hoặc If-Modified-Since. Yêu cầu có điều kiện cũng không riêng Google. Crawler Bing đã hỗ trợ conditional GET, gửi If-Modified-Since và khi có thì If-None-Match, rồi chấp nhận 304 khi nội dung chưa đổi, ít nhất từ bài Live Search năm 2008. Tuy Bing chưa có bài hiện đại tương đương tài liệu Google năm 2024, hãy coi đây là hành vi HTTP chung áp dụng cho cả hai công cụ.
Cách triển khai hỗ trợ 304
- Gửi validator trong phản hồi 200. Cấu hình máy chủ, CDN hoặc ứng dụng gắn
ETag(được khuyên dùng) và/hoặcLast-Modifiedđúng định dạng vào phản hồi200. Nhiều máy chủ và framework tự tạo ETag cho file tĩnh; phản hồi động thường cần bật rõ. - Tôn trọng header có điều kiện khi yêu cầu quay lại. Khi nhận
If-None-Match/If-Modified-Since, so sánh với validator hiện tại; trả304không body nếu còn khớp hoặc200mới nếu không. Máy chủ file tĩnh thường tự làm, còn route ứng dụng và edge worker thường cần cấu hình. - Xác định thế nào là “đã đổi” và giữ ETag ổn định cho nội dung thật sự không đổi; đừng để nén lại hay khác biệt giữa máy chủ làm nó đổi vô ích.
- Theo dõi các cấu hình sai kinh điển:
- Luôn trả 200 — không phát validator nên không yêu cầu nào có điều kiện và mất lợi ích hiệu quả.
- ETag không ổn định — giá trị đổi dù nội dung không đổi, như do cân bằng tải hoặc nén lại, buộc tải lại liên tục.
- 304 cũ — nguy hiểm nhất: máy chủ tiếp tục trả
304hoặc ETag cũ sau khi nội dung thật sự đổi, khiến crawler và cache không nhận bản cập nhật. Đây là lỗi cần phát hiện trong phân tích log, không phải khuyết điểm vốn có của 304.
So sánh 304 với mã trạng thái khác
304 với 301 / 302 / 307 / 308
Các mã kia mới là chuyển hướng thật. 301/308 vĩnh viễn hoặc 302/307 tạm thời mang header Location và đưa client đến URL khác; 301/308 còn truyền tín hiệu canonical hóa. 304 không có Location, không di chuyển ai và không truyền tín hiệu xếp hạng. Cùng họ 3xx về số nhưng nhiệm vụ hoàn toàn khác. Chi tiết từng mã nằm trong bài riêng, gồm chuyển hướng 301 và trang trung tâm chuyển hướng.
304 với 204 No Content
Cả hai đều không body nhưng vì lý do hoàn toàn khác. 204 No Content là thành công 2xx với body cố ý rỗng vì máy chủ thật sự không có gì để gửi, như API DELETE/PUT thành công hoặc analytics beacon. 304 cũng không body, nhưng vì “bạn đã có nội dung và nó vẫn hợp lệ”. Đừng đánh đồng: 204 trên URL trang có thể bị coi như soft 404 vì không có nội dung để lập chỉ mục; 304 xác nhận hiệu lực của nội dung Google đã có. Bài 204 No Content trình bày đầy đủ mã đó.
Quan niệm sai phổ biến về 304
- “304 là chuyển hướng.” Không có header
Locationvà không ai đi đâu; client dùng lại cache. Cụm “redirecting the client to make use of that stored representation” (bản dịch) «hướng client dùng biểu diễn đã lưu» trong RFC 9110 nói về cache, không phải URL khác. - “304 là lỗi cần sửa.” Đây là kết quả đúng của yêu cầu có điều kiện. Thấy 304 trong crawl hoặc DevTools thường nghĩa là cache hoạt động.
- “304 giúp thứ hạng.” Không có tác động trực tiếp đến thứ hạng; Search có thể tính lại tín hiệu URL nhưng 304 không thay đổi việc lập chỉ mục theo cách khác. Lợi ích là tiết kiệm tài nguyên, có thể gián tiếp cải thiện hiệu quả crawl trên site rất lớn, không phải tín hiệu xếp hạng hay cam kết chuyển công sức sang URL khác.
- “If my server returns 304, Google will use stale content forever.” (bản dịch) «Nếu máy chủ trả 304, Google sẽ dùng nội dung cũ mãi.» Không đúng: 304 chỉ xuất hiện khi validator còn khớp. Khi nội dung đổi, triển khai đúng sẽ trả
200mới cùng validator mới. Rủi ro thật là máy chủ cấu hình sai vẫn trả 304 sau thay đổi. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation - “ETag và Last-Modified có thể thay thế hoàn toàn cho nhau.” Cả hai là validator, nhưng
Last-Modifiednhạy với định dạng ngày và chỉ chi tiết đến timestamp;ETagopaque và chính xác hơn, dù có thể khác giữa máy chủ hoặc sau nén lại nếu triển khai bất cẩn. Google khuyên ưu tiên ETag và dùng cả hai nếu có thể.
Câu hỏi thường gặp
HTTP 304 có phải lỗi không? Không. Đây là tín hiệu thành công cho biết cache hoạt động và bản sao của client vẫn hợp lệ.
304 Not Modified có phải chuyển hướng không? Không. Nó thuộc lớp 3xx theo cách đánh số nhưng không có header Location và không đưa client đến URL mới.
304 có giúp SEO hoặc thứ hạng không? Không có tác động trực tiếp đến thứ hạng và không ảnh hưởng lập chỉ mục ngoài khả năng Google tính lại tín hiệu URL. Nó tiết kiệm băng thông và khả năng tính toán khi crawler bỏ qua trang chưa đổi; Google nói điều này có thể gián tiếp cải thiện hiệu quả crawl trên site lớn.
ETag khác Last-Modified thế nào? ETag là dấu vân tay phiên bản opaque được so bằng If-None-Match; Last-Modified là timestamp được so bằng If-Modified-Since. Google khuyên dùng ETag vì ít dễ lỗi hơn.
ETag yếu khác ETag mạnh thế nào? ETag mạnh khẳng định nội dung giống từng byte; ETag yếu có tiền tố W/ khẳng định tương đương ngữ nghĩa và chấp nhận khác biệt nhỏ như nén hoặc ngày ở footer.
Vì sao log hoặc báo cáo crawl có 304? Vì client gửi yêu cầu có điều kiện và máy chủ xác nhận đúng rằng nội dung chưa đổi. Đây là hành vi mong đợi và có lợi.
Làm sao để máy chủ trả 304 đúng? Gửi ETag/Last-Modified trong 200, rồi tôn trọng If-None-Match/If-Modified-Since ở yêu cầu sau bằng cách trả 304 không body khi validator còn khớp.
304 khác 204 thế nào? Cả hai không body; 204 vì không có gì để gửi, 304 vì client đã có một bản sao vẫn hợp lệ.
Googlebot có gửi header có điều kiện trong mọi yêu cầu không? Không. Mức hỗ trợ cache khác nhau theo crawler nên không phải yêu cầu nào cũng có điều kiện dù header được cấu hình đúng.
Phản hồi 304 có thể có body không? Không. RFC 9110 ghi “it cannot contain content or trailers” (bản dịch) «nó không được chứa nội dung hoặc trailer». 304 có body là vi phạm đặc tả. Evidence for this claim A 304 response terminates after the header section and cannot contain content or trailers. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified
Tóm tắt cho AI
Bản cô đọng của phần Nâng cao:
- 304 Not Modified trả lời một GET/HEAD có điều kiện khi điều kiện được đánh giá false và nếu không có điều kiện sẽ nhận 200 (RFC 9110 §15.4.5). Nó thuộc lớp 3xx nhưng KHÔNG phải chuyển hướng: không
Location, không URL mới và theo quy chuẩn không body — “it cannot contain content or trailers” (bản dịch) «nó không được chứa nội dung hoặc trailer». Lần truy cập thứ hai chỉ là ví dụ thường gặp, không phải quy tắc giao thức. - Đây là đáp án cho yêu cầu có điều kiện.
GET/HEADmangIf-None-Matchđể so vớiETagvà/hoặcIf-Modified-Sinceđể so vớiLast-Modified. Validator còn khớp thì máy chủ trả 304 và client dùng cache. - Từ “redirecting” trong đặc tả mang nghĩa ẩn dụ: hướng client về cache của chính nó, không phải URL khác.
- ETag với Last-Modified: ETag là token phiên bản opaque, Last-Modified là ngày theo đúng định dạng HTTP;
If-None-Matchđược ưu tiên khi có cả hai. ETag mạnh nghĩa là giống từng byte; ETag yếu có tiền tốW/nghĩa là tương đương ngữ nghĩa. - Không tác động trực tiếp đến thứ hạng và không thay đổi lập chỉ mục ngoài khả năng Google tính lại tín hiệu URL. Google đã có nội dung; 304 chỉ xác nhận chưa đổi. Gary Illyes nói cache “may help your site be crawled more efficiently” (bản dịch) «có thể giúp site được crawl hiệu quả hơn». Đây là tiết kiệm tài nguyên có thể gián tiếp cải thiện crawl trên site lớn, không phải cam kết phân bổ crawl budget hay tín hiệu thứ hạng.
- Google khuyên ưu tiên ETag vì “less prone to errors and mistakes” (bản dịch) «ít dễ mắc lỗi hơn»; có thể đặt cả hai.
Last-Modifiedphải theo mẫu “Weekday, DD Mon YYYY HH:MM:SS Timezone,” (bản dịch) «Thứ, ngày tháng năm giờ:phút:giây múi giờ». Chỉ làm cache mất hiệu lực khi thay đổi đáng kể. - Mức hỗ trợ cache khác nhau theo crawler nên không phải mọi yêu cầu Googlebot đều có điều kiện. Bing hỗ trợ conditional
GETít nhất từ bài Live Search năm 2008; đây là hành vi HTTP chung. - Đừng nhầm với 301/302/307/308 chuyển URL thật hoặc 204 không body vì không có gì để gửi.
- Rủi ro thật là cấu hình sai vẫn trả 304 sau khi nội dung đổi; hãy phát hiện trong phân tích log. Một 304 hợp lệ cũng có thể trông như lỗi trong một số thư viện client hoặc tầng cache nền tảng dù giao thức không hỏng.
Tài liệu chính thức
Các nguồn sơ cấp về bản chất của 304 và cách công cụ tìm kiếm sử dụng nó.
Đặc tả HTTP và tài liệu trình duyệt
- RFC 9110 §15.4.5 — 304 Nội dung không thay đổi — định nghĩa có thẩm quyền: yêu cầu có điều kiện, không body và các header bắt buộc.
- MDN — 304 Nội dung không thay đổi — giải thích dễ hiểu về tác nhân
If-None-Match/If-Modified-Sincevà danh sách header 304 phải mang. - MDN — Yêu cầu HTTP có điều kiện — giải thích xác thực mạnh và yếu.
- MDN — ETag — header
ETag, gồm cú pháp yếuW/và mạnh.
Google Search Central
- Crawling December: HTTP caching — bài của Gary Illyes ngày 09/12/2024 về cách ETag/If-None-Match và Last-Modified/If-Modified-Since tạo 304 và hỗ trợ hiệu quả crawl.
- Tổng quan Google Crawler (User Agent) — crawler nào hỗ trợ cache và khuyến nghị ETag hơn Last-Modified.
- Ảnh hưởng của mã trạng thái HTTP đến crawler Google — hàng hiện hành về 304, gồm giới hạn rằng Search có thể tính lại tín hiệu URL dù 304 không ảnh hưởng lập chỉ mục theo cách khác.
- Khắc phục lỗi crawl của Google Search — nguồn cho cách nói có điều kiện rằng tiết kiệm tài nguyên “may indirectly” (bản dịch) «có thể gián tiếp» cải thiện hiệu quả crawl và Google không gửi header có điều kiện trong mọi lần crawl.
Bing
- Công bố cải tiến crawler cho Live Search — bài cũ của Bing/Live Search xác nhận hỗ trợ conditional GET, tức
If-Modified-Since/If-None-Matchdẫn đến 304, từ năm 2008.
Trích dẫn từ nguồn
Các phát biểu được ghi nhận dưới đây đều dẫn sâu đến đoạn nguồn hỗ trợ nội dung.
Đặc tả HTTP
- “The 304 (Not Modified) status code indicates that a conditional GET or HEAD request has been received and would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false.” (bản dịch) «Mã 304 cho biết đã nhận yêu cầu GET hoặc HEAD có điều kiện; yêu cầu đó vốn sẽ dẫn đến 200 nếu điều kiện không được đánh giá là false.» — RFC 9110, HTTP Semantics, §15.4.5. Đọc mục này
- “A 304 response is terminated by the end of the header section; it cannot contain content or trailers.” (bản dịch) «Phản hồi 304 kết thúc ở cuối phần header; nó không được chứa nội dung hoặc trailer.» — RFC 9110, §15.4.5, quy tắc bắt buộc không body. Đọc mục này
MDN Web Docs
- “The HTTP
304 Not Modifiedredirection response status code indicates that there is no need to retransmit the requested resources.” (bản dịch) «Mã phản hồi chuyển hướng HTTP304 Not Modifiedcho biết không cần truyền lại tài nguyên được yêu cầu.» Đi đến trích dẫn - “Strong validation consists of guaranteeing that the resource is, byte to byte, identical to the one it is compared to.” (bản dịch) «Xác thực mạnh bảo đảm tài nguyên giống hệt từng byte với tài nguyên được so sánh.» — MDN, Yêu cầu HTTP có điều kiện. Đọc hướng dẫn
Gary Illyes, Google — “Crawling December: HTTP caching” (09/12/2024)
- “Especially if you have a large site with rarely-changing content under individual URLs, allowing caching locally may help your site be crawled more efficiently. Google’s crawling infrastructure supports heuristic HTTP caching as defined by the HTTP caching standard, specifically through the ETag response- and If-None-Match request header, and the Last-Modified response- and If-Modified-Since request header.” (bản dịch) «Đặc biệt với site lớn có nội dung hiếm thay đổi ở từng URL, cache cục bộ có thể giúp crawl hiệu quả hơn. Hạ tầng crawl Google hỗ trợ HTTP caching suy đoán theo tiêu chuẩn qua ETag/If-None-Match và Last-Modified/If-Modified-Since.» Đọc bài viết
- “We strongly recommend using ETag because it’s less prone to errors and mistakes (the value is not structured unlike the Last-Modified value).” (bản dịch) «Chúng tôi đặc biệt khuyên dùng ETag vì ít dễ mắc lỗi hơn; giá trị không có cấu trúc như Last-Modified.» Đọc bài viết
- “If the ETag value sent by the crawler matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body.” (bản dịch) «Nếu ETag crawler gửi khớp giá trị hiện tại do máy chủ tạo, máy chủ nên trả HTTP 304 không có body.» Đọc bài viết
- “Our recommendation is that you require a cache refresh on significant changes to your content; if you only updated the copyright date at the bottom of your page, that’s probably not significant.” (bản dịch) «Hãy yêu cầu làm mới cache khi nội dung thay đổi đáng kể; nếu chỉ cập nhật ngày bản quyền cuối trang thì có lẽ chưa đáng kể.» Đọc bài viết
Nhận định của Patrick Stox trên Ahrefs
- “304 Not Modified – Says the page hasn’t been modified. Typically used for caching.” (bản dịch) «304 Not Modified — cho biết trang chưa được sửa đổi; thường dùng cho cache.» — từ hướng dẫn Mã trạng thái HTTP và tác động SEO của tôi; bài này là phần phân tích sâu mà mục đó chưa có. Đi đến trích dẫn
#:~:text= tự động; vì vậy các câu của Illyes liên kết đến bài thay vì fragment, và từng câu đã được đối chiếu nguyên văn với trang trực tuyến. Hỗ trợ yêu cầu có điều kiện của Bing được dẫn từ bài Live Search năm 2008, không phải tài liệu hiện hành; hãy hiểu là “được hỗ trợ ít nhất từ 2008”, không phải phát biểu mới. Đặt 304 trong ngữ cảnh: các mã không body và 3xx dễ bị nhầm
304 so với các mã trông tương tự
| Mã | Lớp | Body | Header Location | Ý nghĩa thật | Tín hiệu xếp hạng/canonical |
|---|---|---|---|---|---|
304 Not Modified | 3xx | Không có (theo đặc tả) | Không | “Bản cache vẫn hợp lệ — hãy dùng lại” | Không có; chỉ hiệu quả crawl |
301 Moved Permanently | 3xx | — | Có | “Đã chuyển vĩnh viễn — đến đây” | Truyền tín hiệu canonical hóa |
302 Found | 3xx | — | Có | “Tạm thời ở đây” | Không truyền tín hiệu canonical hóa |
307 Temporary Redirect | 3xx | — | Có | Như 302, giữ phương thức | Không truyền tín hiệu canonical hóa |
308 Permanent Redirect | 3xx | — | Có | Như 301, giữ phương thức | Truyền tín hiệu canonical hóa |
204 No Content | 2xx | Không có vì không có gì để gửi | Không | “Thành công, cố ý rỗng” | Không; trên URL trang, có thể bị coi là soft 404 |
200 OK | 2xx | Có nội dung | Không | “Đây là trang” | Có thể được lập chỉ mục |
Cạm bẫy là 304 và 204 đều không body, còn 304/301/302/307/308 đều là 3xx. Nhưng 304 khác biệt trên cả hai trục: đây là mã 3xx duy nhất không di chuyển ai và mã không body duy nhất nghĩa là “bạn đã có nội dung”, không phải “không có gì để gửi”.
Hai validator
| Validator trong phản hồi | Header yêu cầu có điều kiện | Loại | Ghi chú |
|---|---|---|---|
ETag: "abc123" | If-None-Match: "abc123" | Token opaque | Google khuyên ưu tiên; mạnh nghĩa là giống từng byte |
ETag: W/"abc123" | If-None-Match: W/"abc123" | Token yếu | Tiền tố W/ nghĩa là tương đương ngữ nghĩa và chấp nhận khác biệt nhỏ |
Last-Modified: Fri, 4 Sep 1998 19:15:56 GMT | If-Modified-Since: <date> | Timestamp | Cần đúng định dạng HTTP-date; độ chi tiết kém ETag |
Khi có cả hai, If-None-Match được ưu tiên hơn If-Modified-Since.
Thông tin nhanh
- 304 không bao giờ có body; RFC 9110 quy định bắt buộc.
- 304 là mã 3xx nhưng không phải chuyển hướng: không
Location, không URL mới. - Không tác động trực tiếp đến thứ hạng và không thay đổi lập chỉ mục ngoài khả năng Google tính lại tín hiệu URL; lợi ích là tiết kiệm tài nguyên có thể gián tiếp giúp crawl trên site lớn.
- Google khuyên ưu tiên
ETag; đặt cả ETag và Last-Modified vẫn tốt. Last-Modifiedphải theo mẫu “Weekday, DD Mon YYYY HH:MM:SS Timezone” nếu không có thể bị bỏ qua.- Chỉ làm cache mất hiệu lực khi nội dung thay đổi đáng kể, không phải chỉ đổi năm bản quyền ở footer.
- Không phải mọi yêu cầu crawler đều có điều kiện; hỗ trợ cache khác nhau theo crawler.
- Bing hỗ trợ conditional
GET→ 304 ít nhất từ năm 2008; đây là HTTP chung. - Rủi ro thật là 304 cũ sau khi nội dung đổi; hãy phát hiện bằng phân tích log.
Quá trình yêu cầu có điều kiện trong HTTP thô
Các chuỗi yêu cầu/phản hồi cụ thể cho thấy 304 hình thành thế nào. Giá trị header chỉ mang tính minh họa.
ETag / If-None-Match — lần lấy đầu tiên (200)
GET /blog/my-article/ HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: text/html
ETag: "a1b2c3d4"
Cache-Control: max-age=3600
<full page body here>Client lưu body và giá trị ETag.
ETag / If-None-Match — lần lấy tiếp theo, nội dung chưa đổi (304)
GET /blog/my-article/ HTTP/1.1
Host: example.com
If-None-Match: "a1b2c3d4"
HTTP/1.1 304 Not Modified
ETag: "a1b2c3d4"
Cache-Control: max-age=3600Không có body. ETag khớp nên máy chủ tiết kiệm việc tạo trang và băng thông truyền nó; client dùng lại bản cache.
Last-Modified / If-Modified-Since — phương án tương đương dựa trên ngày
GET /blog/my-article/ HTTP/1.1
Host: example.com
If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT
HTTP/1.1 304 Not Modified
Last-Modified: Fri, 4 Sep 1998 19:15:56 GMTLưu ý định dạng HTTP-date chính xác “Weekday, DD Mon YYYY HH:MM:SS Timezone” mà Google khuyên dùng để tránh lỗi phân tích.
Khi nội dung ĐÃ đổi — trả 200 mới, không phải 304
GET /blog/my-article/ HTTP/1.1
Host: example.com
If-None-Match: "a1b2c3d4"
HTTP/1.1 200 OK
Content-Type: text/html
ETag: "e5f6g7h8" ← new value: content changed
<updated page body here>ETag đã lưu không còn khớp, nên máy chủ gửi nội dung mới và validator mới để cache cập nhật. Đây chính là lý do 304 được triển khai đúng không thể “giam” crawler với nội dung cũ: ngay khi nội dung đổi, validator đổi và yêu cầu sau nhận 200 thật.
ETag yếu và mạnh
ETag: "a1b2c3d4" ← strong: asserts byte-for-byte identity
ETag: W/"a1b2c3d4" ← weak: asserts semantic equivalence (the W/ prefix)Quy tắc thực dụng: nếu vận hành site lớn có nhiều URL ít thay đổi, gửi ETag ổn định và tôn trọng If-None-Match trong phản hồi 200 cho phép crawler xác nhận “vẫn như cũ” bằng 304 rẻ và không body. Băng thông cùng khả năng tính toán tiết kiệm được có thể gián tiếp giúp Google crawl phần còn lại hiệu quả hơn. Nếu ETag đổi sau mỗi lần nén lại hoặc khác giữa các máy chủ cân bằng tải, bạn mất lợi ích đó.
Sai lầm với 304 làm hỏng cache có điều kiện
Đổi ETag khi biểu diễn không đổi
ETag gắn với phiên bản máy chủ, lần nén hoặc timestamp yêu cầu sẽ phá validator: nội dung không đổi vẫn luôn trả 200 đầy đủ. Hãy tạo validator ổn định từ biểu diễn hoặc chủ ý dùng ETag yếu khi khác biệt ở cấp byte không có ý nghĩa.
Trả 304 sau khi nội dung đã đổi
Validator cũ có thể che bản cập nhật thật khỏi client và crawler. Hãy làm ETag mất hiệu lực hoặc tăng Last-Modified mỗi khi biểu diễn đổi, rồi xác nhận yêu cầu có điều kiện dùng giá trị cũ nhận 200 mới cùng body.
Gửi 304 khi không có yêu cầu có điều kiện khớp
Máy chủ không nên đoán client có bản cache. Chỉ trả 304 sau khi đánh giá If-None-Match hoặc If-Modified-Since; yêu cầu đầu thông thường cần phản hồi đầy đủ.
Coi 304 như chuyển hướng hoặc trang rỗng
304 không có header Location và không có body phản hồi. Đừng đưa nó qua logic chuyển hướng và đừng thay tài nguyên rỗng thật bằng 304; hãy dùng mã mô tả đúng phản hồi.
Các vấn đề 304 thường gặp
Máy chủ luôn trả 200
Triệu chứng: các yêu cầu lặp lại tải toàn bộ body dù không có gì đổi. Nguyên nhân có thể: phản hồi đầu không có validator hoặc ứng dụng bỏ qua header có điều kiện. Cách sửa: gửi ETag và/hoặc Last-Modified hợp lệ, rồi triển khai kiểm tra If-None-Match hoặc If-Modified-Since tương ứng. Xác nhận yêu cầu cho nội dung chưa đổi trả 304 không body.
Các origin tạo ETag khác nhau
Triệu chứng: cùng một URL chưa đổi luân phiên trả 200 và 304 sau load balancer. Nguyên nhân có thể: mỗi node tự tạo validator. Cách sửa: suy ETag từ trạng thái nội dung dùng chung, không từ node phục vụ, rồi lặp cùng yêu cầu có điều kiện qua nhiều phản hồi.
Nội dung cập nhật vẫn trả 304
Triệu chứng: trình duyệt hoặc crawler giữ biểu diễn cũ sau triển khai. Nguyên nhân có thể: validator không mất hiệu lực cùng nội dung. Cách sửa: sửa cache key hoặc logic triển khai, purge cache bị ảnh hưởng khi cần và chứng minh ETag cũ giờ nhận 200 với validator mới.
Last-Modified có vẻ bị bỏ qua
Triệu chứng: If-Modified-Since không bao giờ tạo 304. Nguyên nhân có thể: HTTP-date không hợp lệ, timestamp thiếu độ chính xác hoặc ETag được ưu tiên. Cách sửa: kiểm tra header thô, sửa định dạng ngày và thử riêng từng validator.
304 trông như lỗi trong mã ứng dụng
Triệu chứng: script hoặc ứng dụng ném exception hay ghi “error” dù yêu cầu nhận 304 hợp lệ. Nguyên nhân có thể: một số thư viện HTTP coi mọi trạng thái khác 200, kể cả 304 hợp lệ, như điều kiện giống exception trừ khi được cấu hình rõ để theo chuyển hướng hoặc chấp nhận not-modified. Đây là đặc tính của thư viện client, không phải lỗi giao thức hay máy chủ. Cách sửa: kiểm tra riêng cách thư viện xử lý 304, không chỉ 4xx/5xx, và xác nhận phản hồi HTTP thô là 304 đúng, không body trước khi quy lỗi cho máy chủ.
Tầng cache nền tảng, như IIS output caching, làm khó chẩn đoán
Triệu chứng: ứng dụng origin có vẻ đúng nhưng hành vi 304 vẫn sai. Nguyên nhân có thể: một tầng cache riêng của nền tảng hosting — IIS output caching là ví dụ được ghi nhận — nằm giữa ứng dụng và client, có thể tự tạo hoặc chặn 304. Cách sửa: coi đây là một tầng có thể có trong số origin, CDN, load balancer và cache nền tảng, không phải nghi phạm mặc định. Dùng phép thử có kiểm soát, lần lượt đổi validator ở từng tầng để cô lập trách nhiệm.
Prompt: kiểm tra dấu vết yêu cầu có điều kiện
Dán header yêu cầu và phản hồi của lần lấy đầu cùng lần lấy lặp lại.
Act as an HTTP caching reviewer. I will paste two request/response header traces for
the same URL: an initial fetch and a conditional repeat. Identify the validator used,
check whether If-None-Match or If-Modified-Since was evaluated correctly, verify that
a 304 has no body or Location header, and flag unstable or stale-validator risks.
Return: observed flow, pass/fail checks, likely cause of each failure, and the exact
next request I should run. Do not infer headers that are not present.
[PASTE BOTH TRACES]Prompt: rà soát triển khai ETag
Dán cấu hình ứng dụng, CDN hoặc máy chủ có liên quan.
Review this ETag/Last-Modified implementation for conditional GET correctness. Trace
the 200 -> conditional request -> 304 path, explain what causes the validator to
change, and test mentally for multiple origin nodes, compression variants, and real
content updates. Separate protocol violations from efficiency issues. Give a minimal
fix and a curl-based validation plan. Do not invent platform behavior.
[PASTE CONFIGURATION OR CODE] Shell: phát lại ETag như yêu cầu có điều kiện
Chạy trong terminal macOS/Linux. Sao chép ETag chính xác, gồm cả dấu ngoặc kép.
URL='https://example.com/page'
curl -sS -D - -o /dev/null "$URL"
curl -sS -D - -o /dev/null -H 'If-None-Match: "PASTE_ETAG_HERE"' "$URL"Phản hồi đầu phải cung cấp validator. Phản hồi thứ hai phải trả 304 khi biểu diễn chưa đổi và 200 khi ETag đã dán là cũ.
PowerShell: kiểm thử Last-Modified
Chạy trong PowerShell sau khi thay URL và timestamp.
$url = 'https://example.com/page'
$headers = @{ 'If-Modified-Since' = 'Tue, 14 Jul 2026 12:00:00 GMT' }
Invoke-WebRequest -Uri $url -Headers $headers -SkipHttpErrorCheckConsole DevTools: liệt kê validator của tài nguyên trang
Chạy trong Console của trình duyệt. Đoạn mã báo các mục resource timing; dùng bảng Network để xem header ETag, Last-Modified và trạng thái thật.
console.table(performance.getEntriesByType('resource').map(r => ({name: r.name, transferSize: r.transferSize, encodedBodySize: r.encodedBodySize}))); Công cụ kiểm tra hành vi 304
- HTTP Header Checker: xem
ETag,Last-Modified,Cache-Control,Varyvà dấu vết CDN/edge trong phản hồi thường trước khi phát lại validator. - Bảng Network của Browser DevTools: bỏ chọn “Disable cache”, tải lại và so sánh header yêu cầu/phản hồi. DevTools cũng hiển thị hành vi HSTS và cache cục bộ, giúp phân biệt hành vi trình duyệt với phản hồi origin.
- curl: gửi chính xác header
If-None-MatchhoặcIf-Modified-Sincemà không bị trạng thái cache trình duyệt can thiệp. - Access log: đo số yêu cầu crawler có điều kiện và liệu chúng kết thúc bằng
304hay200đầy đủ.
Chứng minh phản hồi có điều kiện hoạt động sau thay đổi
Kiểm thử biểu diễn chưa đổi
Cách thử: lấy URL, sao chép ETag rồi lặp bằng curl -I -H 'If-None-Match: "VALUE"' URL. Kết quả mong đợi: 304, validator khớp, không body hay Location. Diễn giải khi thất bại: máy chủ bỏ qua điều kiện hoặc tạo validator không ổn định. Thời gian theo dõi: ngay lập tức. Điều kiện rollback: thay đổi cache làm yêu cầu thường mất phản hồi 200 đầy đủ.
Kiểm thử biểu diễn đã đổi
Cách thử: triển khai một thay đổi nội dung thật rồi phát lại ETag cũ. Kết quả mong đợi: 200 với body cập nhật và validator mới. Diễn giải khi thất bại: cache invalidation bị cũ. Thời gian theo dõi: ngay sau khi triển khai đến mọi origin. Điều kiện rollback: bất kỳ origin nào vẫn trả 304 cho validator cũ sau khi rollout hoàn tất.
Kiểm thử độ ổn định qua nhiều origin
Cách thử: lặp yêu cầu thường và có điều kiện đủ nhiều để chạm các máy trong pool, đồng thời ghi ETag và trạng thái. Kết quả mong đợi: biểu diễn chưa đổi dùng validator tương thích và nhất quán tạo 304. Diễn giải khi thất bại: validator khác theo node hoặc encoding mà không có chiến lược Vary phù hợp. Thời gian theo dõi: ngay lập tức trên toàn pool. Điều kiện rollback: logic validator mới phục vụ nội dung cũ hoặc trộn biểu diễn giữa client.
Đo sức khỏe cache có điều kiện
Tỷ lệ tái xác thực có điều kiện thành công
Chỉ số: yêu cầu có điều kiện kết thúc bằng 304 so với 200 đầy đủ. Cho biết: tài nguyên chưa đổi có tránh được lần truyền thừa hay không. Cách lấy: nhóm yêu cầu access log mang If-None-Match hoặc If-Modified-Since theo trạng thái phản hồi và loại URL. Mốc tham chiếu/phạm vi thực tế: lập baseline theo loại nội dung; đừng ép trang thường đổi đạt tỷ lệ của tài sản tĩnh. Nhịp đo: hàng tuần trong rollout, sau đó hàng tháng.
Số byte tránh truyền khi nội dung chưa đổi
Chỉ số: ước tính số byte body không truyền nhờ phản hồi 304 hợp lệ. Cho biết: mặt băng thông của lợi ích hiệu quả crawl. Cách lấy: nối số 304 trong log với kích thước phản hồi đầy đủ gần nhất của cùng loại URL. Mốc tham chiếu/phạm vi thực tế: so với baseline trước thay đổi của chính site; không có mục tiêu chung phù hợp mọi hỗn hợp nội dung. Nhịp đo: hàng tháng.
Lỗi validator cũ
Chỉ số: URL đã đổi vẫn chấp nhận validator cũ. Cho biết: hiệu quả có làm mất độ mới hay không. Cách lấy: chạy mẫu nhỏ sau triển khai bằng cách phát lại ETag trước triển khai. Mốc tham chiếu/phạm vi thực tế: mọi phản hồi cũ đã xác nhận đều cần điều tra. Nhịp đo: sau mỗi lần triển khai thay đổi cache hoặc cách tạo validator.
Tự kiểm tra: 304 Not Modified
Năm câu hỏi nhanh về ý nghĩa và cách hoạt động của 304. Chọn một đáp án cho mỗi câu rồi kiểm tra.
Nhật ký thay đổi
Đã cập nhật 22 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 9 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 8 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 17 thg 7, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Try it live
This is a real endpoint on this site — not a simulation.
Hit it from the button, open it in a new tab, or
curl -i it from your terminal, and the server answers with the actual status code this article is about.