Sự khác biệt giữa mã trạng thái HTTP 200 (bộ đệm) so với mã trạng thái 304 là gì?


201

Tôi đang sử dụng trình cắm "Tốc độ trang" của Google để Firefox truy cập trang web của tôi.

Một số thành phần trên trang của tôi được chỉ định là trạng thái HTTP:

200 200 (bộ nhớ cache) 304

Bởi "Tốc độ trang" của Google.

Điều tôi bối rối là sự khác biệt giữa 200 (bộ đệm) và 304.

Tôi đã làm mới trang nhiều lần (nhưng chưa xóa bộ nhớ cache) và dường như favicon.ico của tôi và một vài hình ảnh là status = 200 (bộ đệm) trong khi một số hình ảnh khác là trạng thái http 304.

Tôi không hiểu tại sao sự khác biệt.

CẬP NHẬT :

Sử dụng Google "Tốc độ trang", tôi nhận được "200 (bộ nhớ cache)" cho http://example.com/favicon.ico cũng như http://cdn.example.com/js/ga.js

Nhưng, tôi nhận được trạng thái http "304" cho http://cdn.example.com/js/combined.min.js

Tôi không hiểu tại sao tôi có hai tệp JavaScript nằm trong cùng thư mục / js /, một tệp trả về trạng thái http 304 và tệp kia trả về mã trạng thái 200 (bộ đệm).

Câu trả lời:


220

Các mục có mã "200 (bộ đệm)" được thực hiện trực tiếp từ bộ đệm của trình duyệt của bạn, có nghĩa là các yêu cầu ban đầu cho các mục được trả về với các tiêu đề cho biết rằng trình duyệt có thể lưu trữ chúng (ví dụ: ngày Expireshoặc Cache-Control: max-agetiêu đề trong tương lai ) và tại Khi bạn kích hoạt yêu cầu mới, các đối tượng được lưu trong bộ nhớ cache đó vẫn được lưu trữ trong bộ đệm cục bộ và chưa hết hạn.

Mặt khác, 304s là phản hồi của máy chủ sau khi trình duyệt đã kiểm tra xem một tệp có bị sửa đổi kể từ phiên bản cuối cùng mà nó đã lưu trong bộ nhớ cache hay không (câu trả lời là "không").

Để có hiệu suất web tối ưu nhất, tốt nhất bạn nên đặt tiêu đề Expires:hoặc tương lai xa Cache-Control: max-agecho tất cả các tài sản và sau đó khi cần thay đổi một tài sản, thay đổi tên tệp thực của tài sản hoặc nối thêm chuỗi phiên bản vào yêu cầu cho tài sản đó. Điều này loại bỏ sự cần thiết cho bất kỳ yêu cầu nào được thực hiện trừ khi tài sản đã thay đổi hoàn toàn từ phiên bản trong bộ đệm (không cần phản hồi 304 đó). Google có nhiều chi tiết hơn về việc sử dụng đúng bộ nhớ đệm dài hạn .


2
Vì vậy, những gì tốt hơn để có từ góc độ tốc độ ... "200 (bộ đệm)" hoặc "304" thông điệp trạng thái http?
Hank

22
200 bộ đệm. Một số lưu ý tốt về vấn đề này tại đây: developer.yahoo.com/performance/rules.html#Exires . Bạn muốn thời gian hết hạn càng lâu càng tốt trên tài sản của mình, nhưng phải cân bằng điều này với thực tế là bạn mất một lượng kiểm soát nhất định theo cách này. Một điều bạn có thể làm là đặt thời hạn sử dụng lâu dài cho các tệp và sau đó khi cần tăng số phiên bản tài sản cho các tệp đó. Ví dụ: bạn có thể bao gồm style.css? V1 và gia tăng trong phần tử <link> thành style.css? V2 khi có thay đổi.
Ben Regenspan

1
Công lý, vậy tại sao báo cáo Firebird cho ga.js được lấy từ bộ đệm cục bộ (status = 200 cache) trong khi kết hợp.min.js đang báo cáo trạng thái 304 http. Điều kỳ lạ là cả hai tệp đều có cùng loại tệp (JavaScript) và nằm trong cùng thư mục máy chủ. Bạn sẽ nghĩ cả hai sẽ là 200 hoặc 304, và không khác nhau
Hank

8
Các tiêu đề max-ageagekết hợp cũng có thể dẫn đến kết quả 200 (bộ đệm) nếu agenhỏ hơn max-age. Một ngoại lệ là khi người dùng nhấp vào nút làm mới trình duyệt, trong trường hợp đó, tiêu đề 304 được gửi.
yitwail

2
HTML5 Boilerplate khuyến cáo không nên sử dụng phương pháp chuỗi truy vấn của sửa bộ nhớ cache - nó tốt hơn để thay đổi href, url,srctài liệu tham khảo cho mỗi tập tin bao gồm một 'dấu vân tay' (hoặc một hash của file hoặc đơn giản số lượng tăng lên), và sau đó cho máy chủ để loại bỏ dấu vân tay đó và chỉ phục vụ style.csshoặc bất cứ điều gì. Nếu bạn không thể làm điều đó trên máy chủ, hãy để hệ thống xây dựng của bạn đổi tên các tệp thực tế bằng dấu vân tay.
iono

62

200 (bộ đệm) có nghĩa là Firefox chỉ đơn giản là sử dụng phiên bản được lưu trữ cục bộ. Đây là cách nhanh nhất vì không có yêu cầu nào đối với máy chủ Web được thực hiện.

304 có nghĩa là Firefox đang gửi yêu cầu có điều kiện "Nếu-Sửa đổi-Từ" đến máy chủ Web. Nếu tệp chưa được cập nhật kể từ ngày được trình duyệt gửi, máy chủ Web sẽ trả về phản hồi 304, về cơ bản là cho Firefox sử dụng phiên bản được lưu trong bộ nhớ cache của nó. Nó không nhanh bằng 200 (bộ đệm) vì yêu cầu vẫn được gửi đến máy chủ Web, nhưng máy chủ không phải gửi nội dung của tệp.

Đối với câu hỏi cuối cùng của bạn, tôi không biết tại sao hai tệp JavaScript trong cùng một thư mục lại trả về các kết quả khác nhau.


18

Điều này đã ném tôi trong một thời gian dài quá. Điều đầu tiên tôi xác minh là bạn không tải lại trang bằng cách nhấp vào nút làm mới, điều đó sẽ luôn đưa ra yêu cầu có điều kiện cho tài nguyên và sẽ trả lại 304 giây cho nhiều thành phần của trang. Thay vào đó, hãy vào thanh url chọn trang và nhấn enter như thể bạn vừa gõ lại cùng một URL, điều đó sẽ cho bạn một chỉ báo tốt hơn về những gì được lưu trữ đúng cách. Bài viết này thực hiện một công việc tuyệt vời giải thích sự khác biệt giữa các yêu cầu có điều kiện và không có điều kiện và cách nút làm mới ảnh hưởng đến chúng: http://bloss.msdn.com/b/ieiinterals/archive/2010/07/08/technical-inif-about- có điều kiện-http-request-and-the-refresh-button.aspx


1
Tôi thậm chí không thể mô tả bao nhiêu thời gian tôi đã cố gắng để tìm ra 304 trạng thái yêu cầu tới CDN. Mặc dù bạn trả lời một câu hỏi hơi khác nhau, bạn xứng đáng nhận được tiền thưởng :-)
Peeech

Bạn đã đúng: sự khác biệt trong các mã có liên quan đến thực tế là bạn đang tải lại hoặc không cùng một trang. Nếu tôi tải lại một trang, tôi sẽ thấy trong mạng của trình duyệt theo dõi mã 304. Nhưng, nếu tôi truy cập một URL khác sử dụng cùng các tệp này, tôi sẽ thấy trong mạng của trình duyệt theo dõi mã 200 (từ bộ đệm). Trong trường hợp của tôi, URL kia chỉ là một chuỗi truy vấn được nối với URL gốc (trang là về cơ bản là giống nhau).
aldemarcalazans

8

HTTP 304 là "không được sửa đổi". Máy chủ web của bạn về cơ bản đang nói với trình duyệt "tệp này đã không thay đổi kể từ lần cuối bạn yêu cầu." Trong khi HTTP 200 nói với trình duyệt "đây là phản hồi thành công" - sẽ được trả lại khi đó là lần đầu tiên trình duyệt của bạn truy cập tệp hoặc lần đầu tiên một bản sao được sửa đổi được truy cập.

Để biết thêm thông tin về mã trạng thái, hãy xem http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .


Đó cũng là sự hiểu biết của tôi ... đó là lý do tại sao tôi đã nói trong bài viết gốc của mình rằng tôi đã làm mới trang của mình nhiều lần và vẫn nhận được "200 (bộ đệm)" cho cùng một favicon.ico và JavaScript cụ thể bao gồm tôi có. Rất lạ
Hank

2
200 thực sự không có nghĩa là lưu trữ, nó chỉ có nghĩa là OK. Rất có thể là cấu hình máy chủ của bạn không yêu cầu trình duyệt lưu bộ đệm ico và js của bạn một cách rõ ràng, điều này sẽ khiến nó trả về mã trạng thái 200.
richleland

Đó không phải là trường hợp b / c trên một số JavaScript của tôi, tôi nhận được 304 và JavaScript khác tôi nhận được "200 (bộ đệm)". Tất cả JavaScript nằm trong cùng một thư mục máy chủ web example.com/js/
Hank

Tôi nên thêm 200 (bộ đệm) chỉ có nghĩa là nó được lưu trong bộ nhớ cache cục bộ và không thực sự yêu cầu máy chủ, việc này sẽ nhanh hơn so với việc đi đến máy chủ và nhận được phản hồi 304.
richleland

Tôi đã cập nhật bài viết gốc của mình để hiển thị trang web trực tiếp của tôi và JavaScript được đề cập. Xin vui lòng xem bài viết gốc cập nhật của tôi.
Hank

2

Đối với câu hỏi cuối cùng của bạn, tại sao? Tôi sẽ cố gắng giải thích với những gì tôi biết

Một lời giải thích ngắn gọn về ba mã trạng thái trong các điều khoản của giáo dân.

  • 200 - thành công (yêu cầu trình duyệt và nhận tệp từ máy chủ)

Nếu bộ nhớ đệm được kích hoạt trong máy chủ

  • 200 (từ bộ nhớ cache) - tệp được tìm thấy trong trình duyệt, vì vậy trình duyệt sẽ không yêu cầu từ máy chủ
  • 304 - trình duyệt yêu cầu một tệp nhưng nó bị máy chủ từ chối

Đối với một số tệp, trình duyệt đang quyết định yêu cầu từ máy chủ và đối với một số tệp, nó quyết định đọc từ các tệp được lưu trữ (lưu trữ). Tại sao lại thế này? Mỗi tệp có thời hạn sử dụng, vì vậy

Nếu một tệp chưa hết hạn thì trình duyệt sẽ sử dụng từ bộ đệm (200 bộ đệm).

Nếu tệp hết hạn, trình duyệt yêu cầu máy chủ cho một tệp. Máy chủ kiểm tra tệp ở cả hai nơi (trình duyệt và máy chủ). Nếu cùng một tập tin được tìm thấy, máy chủ từ chối yêu cầu. Theo trình duyệt giao thức sử dụng tập tin hiện có.

nhìn vào cấu hình nginx này

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Ở đây thời hạn sử dụng được đặt thành 60 giây, vì vậy tất cả các tệp tĩnh được lưu trong 60 giây. Vì vậy, nếu bạn yêu cầu một tệp một lần nữa trong vòng 60 giây, trình duyệt sẽ đọc từ bộ nhớ (200 bộ nhớ). Nếu bạn yêu cầu sau 60 giây trình duyệt sẽ yêu cầu máy chủ (304).

Tôi giả sử rằng tệp không bị thay đổi sau 60 giây, trong trường hợp đó bạn sẽ nhận được 200 (tức là tệp cập nhật sẽ được tìm nạp từ máy chủ).

Vì vậy, nếu các máy chủ được cấu hình với các tiêu đề (chính sách) hết hạn và bộ nhớ đệm khác nhau, trạng thái có thể khác nhau.

Trong trường hợp của bạn, bạn đang sử dụng cdn, mục đích chính của cdn là tính sẵn sàng cao và giao hàng nhanh. Do đó, họ sử dụng nhiều máy chủ. Mặc dù có vẻ như các tệp nằm trong cùng một thư mục, cdn có thể sử dụng nhiều máy chủ để cung cấp nội dung u, nếu các máy chủ đó có cấu hình khác nhau. Sau đó, những trạng thái có thể thay đổi. Hy vọng nó giúp.


Máy chủ 304 - Không được sửa đổi không phải là "từ chối" bởi máy chủ. Đó là máy chủ khai báo cho khách hàng "đối với phiên bản bạn đang yêu cầu, tôi biết nó không được sửa đổi, bạn không thực sự cần tệp". Về mặt kỹ thuật, 304 là một trong những mã phản hồi "chuyển hướng". Nó nói với khách hàng "lấy nó từ bộ nhớ cache của riêng bạn".
Bob Kuhar
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.