2011-01-21 30 views
18

Tôi đã có một tài nguyên trong Nginx của tôi đã được cấu hình như thế này:Tiêu đề Bộ nhớ cache kiểm soát lặp lại; hợp lệ hay không? (Nginx)

location ~ foo\.js$ { 
    add_header Cache-Control public; 
    expires 1d; 
} 

Nếu tôi mở này với Firebug và nhìn vào các tiêu đề nó cho thấy điều này:

Cache-Control max-age=86400, public 

Các trang web đang sử dụng HTTPS nên tôi muốn đảm bảo rằng tôi nhận được đúng vì trình duyệt dường như không lưu vào bộ nhớ cache trừ khi nó là độ tuổi tối đa> 0 AND public. See this

Nhưng những gì xảy ra với Nginx của tôi khi tôi sử dụng curl -Ik https://... là nó nói:

... 
Expires: Sat, 22 Jan 2011 18:23:36 GMT 
Cache-Control: max-age=86400 
Cache-Control: public 
... 

Nó lặp lại Cache-Control tiêu đề! Rõ ràng Firebug không bận tâm. Nhưng đúng không?

Có cách nào tốt hơn để đặt ExpiresCache-Control (với public) chỉ bằng một dòng?

+0

Bạn có chắc chắn về việc cần độ tuổi tối đa và công khai không? Theo thông số kỹ thuật (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html), mục 14.9.3 nói rằng "Chỉ thị tuổi tối đa về phản hồi ngụ ý rằng phản hồi có thể lưu vào bộ nhớ cache (tức là" – herbrandson

Trả lời

24

Có, nó hợp lệ và tương đương với việc sử dụng nhiều tiêu đề Kiểm soát bộ nhớ cache.

Từ HTTP 1.1 spec:

Nhiều lĩnh vực thông điệp tiêu đề với lĩnh vực tên tương tự có thể có mặt trong nhắn khi và chỉ khi toàn bộ lĩnh vực có giá trị cho rằng lĩnh vực tiêu đề là định nghĩa dưới dạng danh sách được phân cách bằng dấu phẩy [ví dụ: # (giá trị)]. PHẢI PHẢI có thể để kết hợp nhiều trường tiêu đề thành một "tên trường: giá trị trường" , mà không thay đổi ngữ nghĩa của thư, bằng cách thêm mỗi trường giá trị trường tiếp theo vào đầu tiên, bằng dấu phẩy.

Thật dễ dàng để xác minh rằng quy định này áp dụng đối với tiêu đề Cache-Control vì how it's defined:

Cache-Control = "Cache-Control" ":" 1 # bộ nhớ cache chỉ

Để hiểu cách diễn giải dòng ở trên, xem thông số kỹ thuật notational conventions. 1# có nghĩa là "danh sách được phân tách bằng dấu phẩy của một hoặc nhiều".

+1

Vì vậy, nó có giá trị dựa trên thông số HTTP, nhưng câu hỏi thực sự là làm cách nào để các trình duyệt và proxy phổ biến đối phó với nhiều tiêu đề Cache-Control? mới nhất-và-lớn nhất có thể xử lý nó một cách chính xác, nhưng Firefox đặc biệt dường như không bộ nhớ cache khi có bất cứ điều gì "không phổ biến" về thiết lập tiêu đề bộ nhớ cache kiểm soát của bạn. bản thân mình nếu nó đã được thực hiện ;-) – rmalayter

+0

Quy ước không hợp lý mà tôi đã bỏ qua khi đọc thông số là 1 # cache-directive có nghĩa là một danh sách được phân tách bằng dấu phẩy của một hoặc nhiều chỉ thị bộ nhớ cache. [quy ước không hợp lệ] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html) –

5

Tôi gặp sự cố tương tự với cấu hình khác. Điều gì làm việc cho tôi là thay đổi thứ tự của hai dòng đặt tiêu đề và đặt tiêu đề địa điểm ngay sau dấu ngoặc mở "máy chủ". Điều này sẽ đặt tiêu đề cho tất cả các đối tượng có lẽ nhưng có thể cũng sẽ hoạt động trong bạn "if" statement too:


server { 
    expires  31d; 
    add_header Cache-Control public; 

    server_name example.com 
    ... 
} 

 

Dường như add_header gửi tiêu đề trước khi hết hạn chỉ thị có thời gian thay đổi nó.

+0

Không chính xác câu trả lời cho câu hỏi được yêu cầu nhưng có liên quan cao, IMO. –

+0

Ngoài ra nó không phải Ork nữa '' ' Cache-Control: max-age = 3600 \ n Cache-Control: private, phải xác nhận lại, proxy xác nhận lại, max-age = 3600''' cấu hình nói: ' '' hết hạn 1 giờ; \ n add_header Bộ nhớ cache-Kiểm soát "riêng tư, phải xác thực lại, xác thực proxy, tối đa tuổi = 3600"; '' '(xin lỗi về định dạng) –

Các vấn đề liên quan