Làm cách nào để đặt tiêu đề HTTP (để kiểm soát bộ đệm)?


236

Làm cách nào để bật bộ nhớ đệm trình duyệt cho trang web của tôi? Tôi chỉ cần đặt kiểm soát bộ đệm: công khai ở đâu đó trong tiêu đề của tôi như thế này?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

Tôi đang sử dụng phiên bản PHP mới nhất đang phát triển trên phiên bản XAMPP mới nhất.


bạn đang sử dụng ngôn ngữ phía máy chủ nào? PHP?, ASP?, JSP? cách bạn đặt các tiêu đề tương tự nhưng không hoàn toàn giống nhau. Hoặc nếu bạn đang lưu trữ hình ảnh ... thường thì điều này được thực hiện trong cấu hình Apache (hoặc máy chủ web) của bạn
scunliffe

Đáng buồn thay, "giải pháp" chỉ đơn giản là tạo ra một DOCTYPE không hợp lệ ;-) Nếu bạn muốn làm điều đó từ HTML (tôi không khuyên dùng nó), bạn sẽ sử dụng META HTTP-EQUIV

Câu trả lời:


197

Để sử dụng kiểm soát bộ đệm trong HTML, bạn sử dụng thẻ meta , ví dụ:

<meta http-equiv="Cache-control" content="public">

Giá trị trong trường nội dung được xác định là một trong bốn giá trị bên dưới.

Một số thông tin về Cache-Controltiêu đề như sau

HTTP 1.1. Giá trị được phép = PUBLIC | RIÊNG TƯ | KHÔNG-CACHE | KHÔNG-CỬA HÀNG.

Công khai - có thể được lưu trong bộ nhớ cache được chia sẻ công khai.
Riêng tư - chỉ có thể được lưu trong bộ nhớ cache riêng tư.
No-Cache - có thể không được lưu trữ.
Không có cửa hàng - có thể được lưu trữ nhưng không được lưu trữ.

Lệnh CACHE-KIỂM SOÁT: NO-CACHE chỉ ra thông tin được lưu trong bộ nhớ cache không nên được sử dụng và thay vào đó, các yêu cầu nên được chuyển tiếp đến máy chủ gốc. Lệnh này có cùng ngữ nghĩa với PRAGMA: NO-CACHE.

Khách hàng NÊN bao gồm cả PRAGMA: NO-CACHE và CACHE-CONTROL: NO-CACHE khi yêu cầu không có bộ đệm được gửi đến máy chủ không được biết là tuân thủ HTTP / 1.1. Cũng xem HẾT HẠN.

Lưu ý: Có thể tốt hơn khi chỉ định các lệnh bộ đệm trong HTTP so với trong các câu lệnh META, nơi chúng có thể ảnh hưởng nhiều hơn trình duyệt, nhưng proxy và các trung gian khác có thể lưu trữ thông tin.


30
HTML5 cấm điều này<meta>luôn là một cách khủng khiếp và dễ hiểu để chỉ định bộ nhớ đệm.
Kornel

1
@yheL Tôi gặp khó khăn khi hiểu phần nào trong các liên kết của bạn cấm phần nào của câu trả lời ... thông số kỹ thuật của thẻ meta không nói gì về việc không thích những gì được viết ở đây hoặc cấm nó?
Félix Gagnon-Grenier

1
@ FélixGagnon-Grenier "Thuộc tính http-Equiv là một thuộc tính liệt kê" có nghĩa là nó chỉ cho phép các giá trị trong bảng trong thông số kỹ thuật. Nó thậm chí còn gọi bộ nhớ đệm trong phần sau ("các chỉ thị pragma khác"):> Các chỉ thị thực dụng tương ứng với các tiêu đề ảnh hưởng đến mô hình xử lý HTTP (ví dụ: bộ đệm) không được đăng ký, vì chúng sẽ dẫn đến hành vi ở mức HTTP khác tác nhân người dùng thực hiện HTML hơn cho tác nhân người dùng không.
Kornel

3
Tài liệu được trích dẫn là không chính xác đối với no-storegiá trị (mặc dù tài liệu tham chiếu RFC 2068 ) - no-storengăn tài liệu được lưu trữ / lưu trữ ở mọi nơi, mọi nơi. Trong khi đó no-cachecho phép nó được lưu trữ, nhưng nó phải kiểm tra với máy chủ mỗi lần. Các trình duyệt sẽ có xu hướng lưu trữ no-cachecác trang để kích hoạt chức năng nút quay lại, v.v.
MrWhite

3
Google cung cấp một trong những tài liệu tham khảo đơn giản nhất cho bộ nhớ đệm HTTP IMO: developers.google.com/web/fundamentals/performance/
mẹo

136

Bạn có thể đặt các tiêu đề trong PHP bằng cách sử dụng:

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

Lưu ý rằng các tiêu đề chính xác được sử dụng sẽ phụ thuộc vào nhu cầu của bạn (và nếu bạn cần hỗ trợ HTTP 1.0 và / hoặc HTTP 1.1 )


3
PragmaExpirescó lẽ là dư thừa cho phần lớn các trình duyệt. fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai yeah HTTP / 1.0 cũng hết hạn ... chỉ sử dụng các tiêu đề bạn cần dựa trên ma trận người dùng của bạn
scunliffe

48

Như tôi đã viết là tốt nhất để sử dụng các tập tin .htaccess. Tuy nhiên, hãy cẩn thận với thời gian bạn để lại nội dung trong bộ đệm.

Sử dụng:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Trong đó: 604800 = 7 ngày

PS: Điều này có thể được sử dụng để thiết lập lại bất kỳ tiêu đề


29

Trang tại http://www.askapache.com/htaccess/apache-speed-cache-control.html gợi ý sử dụng một cái gì đó như thế này:

Thêm tiêu đề kiểm soát bộ đệm

Điều này đi trong tệp .htaccess gốc của bạn nhưng nếu bạn có quyền truy cập vào httpd.conf thì tốt hơn.

Mã này sử dụng chỉ thị FilesMatch và chỉ thị Tiêu đề để thêm Tiêu đề kiểm soát bộ đệm vào các tệp nhất định.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
Là thứ tự trong quan trọng này? "Tuổi tối đa = 290304000, công khai" Hoặc "công khai, tuổi tối đa = 290304000" hoặc cả hai đều đúng như nhau?
Satya Prakash

2
Thứ tự không quan trọng nếu các giá trị không xung đột (như cacheno-cache). max-agepublickhông xung đột để trật tự không quan trọng.
Blaise

1
Lưu ý rằng vì nó sử dụng Headerchỉ thị, bạn phải kích hoạt mod_headers.
Skippy le Grand Gourou

@Skippy le Grand Gourou làm cách nào để bật mod_headers?
Sam

@SamuelStratford Tôi đọc nó khác với các bản phân phối khác, nhưng trong Debian bạn có thể sử dụng a2enmodhoặc tạo một liên kết tượng trưng từ /etc/apache2/mods-available/headers.loadđến /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou

20

Đây là thứ tốt nhất .htaccesstôi đã sử dụng trong trang web thực tế của mình:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
Ví dụ gần như hoàn hảo của tệp .htaccess ... Sẽ hoàn tất nếu bao gồm các hình ảnh cụ thể & cách ghi đường dẫn đến hình ảnh VÀ nơi đặt tệp .htaccess (ví dụ: trong thư mục hình ảnh hoặc thư mục chỉ mục)? .. .ví dụ. '<IfModule mod_headers.c> <Files /img/myimage.jpg> Tiêu đề nối thêm Kiểm soát bộ đệm "max-age = 3600, phải xác nhận lại" </ Files> </ IfModule>' ... điều này có hoạt động không? .. . HOẶC ... hoặc dán vào img dir '<filesmatch "^ (ví dụ \ .jpg | sample \ .png) $"> Tiêu đề đặt Bộ điều khiển bộ đệm "max-age = 31536000, công khai" </ filesmatch>' .. . Một tất cả cùng chiến lược dường như rủi ro - anyway ví dụ cụ thể sẽ là tuyệt vời nếu poss
Marco-UandL

2
chỉ FYI: nén gzip trên các tệp JS và CSS có thể giúp phá vỡ mã hóa SSL của bạn. Nếu bạn dựa vào bảo mật, đừng bật gzip
Eduard Void

1
Đây là bộ đệm trang tài khoản đăng nhập, vì vậy bạn không thể đăng xuất khỏi tài khoản của mình. Thậm chí tệ hơn là ai đó không thể truy cập trang tài khoản và đăng nhập bằng lần đăng nhập cuối cùng của người dùng. Không nên sử dụng trên trang web Thương mại điện tử, sau đó bạn nên xóa <filesMatch "\.(x?html?|php)$">để tránh các trang HTML tĩnh được lưu vào bộ đệm. Phần còn lại của filematches là ok.
nicoX

1
Bạn đã nhân đôi <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
nicoX

2
Bạn đặt cssjsở chế độ riêng tư nếu bạn có bộ đệm proxy. Tôi không thể tìm thấy bất kỳ khuyến nghị trong liên kết của bạn về điều đó. Hầu hết các CDN đều khuyên bạn nên lưu trữ các giá trị đó.
nicoX

13

Đối với máy chủ Apache, bạn nên kiểm tra mod_Exires để đặt tiêu đề Hết hạn và Kiểm soát bộ đệm.

Ngoài ra, bạn có thể sử dụng chỉ thị Tiêu đề để tự thêm Kiểm soát bộ đệm:

Header set Cache-Control "max-age=290304000, public"

5

Thẻ kiểm soát bộ đệm meta cho phép nhà xuất bản Web xác định cách xử lý các trang bằng bộ đệm. Chúng bao gồm các chỉ thị để khai báo những gì cần lưu trong bộ nhớ cache, những gì có thể được lưu trữ bằng bộ nhớ cache, sửa đổi cơ chế hết hạn và xác nhận lại và kiểm soát tải lại.

Các giá trị được phép là:

Công khai - có thể được lưu trong bộ nhớ cache được chia sẻ công khai
Riêng tư - chỉ có thể được lưu trong bộ nhớ cache riêng tư
no-Cache - có thể không được lưu trong bộ nhớ cache
không lưu trữ - có thể được lưu trong bộ nhớ cache nhưng không được lưu trữ

Hãy cẩn thận về trường hợp nhạy cảm. Thêm thẻ meta sau vào nguồn trang web của bạn. Sự khác biệt về chính tả ở cuối thẻ là bạn sử dụng "/> = xml hoặc"> = html.

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

Nguồn-> MetaTags


chỉnh: không có cửa hàng không nên được lưu trữ, không có bộ nhớ cache được phép được lưu trữ nhưng phải được kiểm tra với máy chủ trước khi reserved - xem palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse

Kiểm soát bộ nhớ cache không lưu trữ - không lưu trữ tương tự như không có bộ đệm trong đó phản hồi không thể được lưu trữ và sử dụng lại, tuy nhiên có một sự khác biệt quan trọng. không có cửa hàng yêu cầu tài nguyên được yêu cầu và tải xuống từ máy chủ gốc mỗi lần. Đây là một tính năng quan trọng khi xử lý thông tin cá nhân.
MarcoZen

5

OWASP khuyến nghị như sau,

Bất cứ khi nào có thể, đảm bảo tiêu đề HTTP kiểm soát bộ đệm được đặt với không có bộ đệm, không lưu trữ, phải xác nhận lại, riêng tư; và tiêu đề HTTP pragma được đặt không có bộ đệm.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
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.