HTTP üstbilgileri nasıl ayarlanır (önbellek kontrolü için)?


237

Sitem için tarayıcı önbelleğe almayı nasıl etkinleştiririm? Sadece önbellek kontrolü koyabilir miyim?

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

XAMPP'nin son sürümü üzerinde gelişen PHP'nin son sürümünü kullanıyorum.


hangi sunucu tarafı dilini kullanıyorsunuz? PHP ?, ASP ?, JSP? başlıkları ayarlama şekliniz benzerdir, ancak aynı değildir. Veya görüntüleri önbelleğe alıyorsanız ... genellikle bu Apache (veya web sunucusu) yapılandırmanızda yapılır
scunliffe

Ne yazık ki bu "çözüm" basitçe geçersiz DOCTYPE üretir ;-) sen (ben bunu tavsiye etmem) HTML yapmak isterseniz, kullanacağınız META HTTP-EQUIV

Yanıtlar:


198

HTML'de önbellek kontrolünü kullanmak için meta etiketi , ör.

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

İçerik alanındaki değer, aşağıdaki dört değerden biri olarak tanımlanır.

Cache-ControlÜstbilgiyle ilgili bazı bilgiler aşağıdaki gibidir

HTTP 1.1. İzin verilen değerler = KAMU | ÖZEL | ÖNBELLEK YOK | NO-SAKLA.

Genel - ortak paylaşılan önbelleklerde önbelleğe alınabilir.
Özel - yalnızca özel önbellekte önbelleğe alınabilir.
Önbellek Yok - önbelleğe alınamayabilir.
Mağaza Yok - önbelleğe alınabilir ancak arşivlenemez.

CACHE-CONTROL: NO-CACHE yönergesi, önbelleğe alınan bilgilerin kullanılmaması ve bunun yerine isteklerin başlangıç ​​sunucusuna iletilmesi gerektiğini belirtir. Bu direktif PRAGMA: NO-CACHE ile aynı semantiğe sahiptir.

Müşteriler GEREKEN no-cache istek değil, HTTP / 1.1 uyumlu olduğu bilinen bir sunucuya gönderildiğinde NO-CACHE: no-cache ve Cache-Control: Her iki Pragma arasındadır. Ayrıca bkz. EXPIRES.

Not: HTTP'de önbellek komutlarını, tarayıcıdan daha fazlasını etkileyebilecekleri META ifadelerine göre, ancak önbelleğe alabilecek proxy'ler ve diğer aracılar belirtmek daha iyi olabilir.


30
HTML5 bunu yasaklar ve <meta>önbelleğe almayı belirtmenin her zaman korkunç ve kesintili bir yolu olmuştur.
Kornel

1
@porneL Bağlantılarınızın hangi kısmının cevabın hangi kısmını yasakladığını anlamakta sorun yaşıyorum ... meta etiket özellikleri burada yazılanları beğenmemek veya yasaklamak hakkında hiçbir şey söylemiyor mu?
Félix Gagnon-Grenier

1
@ FélixGagnon-Grenier "http-equiv özelliği numaralandırılmış bir özelliktir", yalnızca spesifikasyondaki tablodaki değerlere izin verdiği anlamına gelir. Hatta daha sonraki bölümde ("diğer pragma direktifleri") önbellekleme çağrısı yapar:> HTTP işleme modelini (örn. Önbellekleme) etkileyen başlıklara karşılık gelen Pragma direktifleri kaydedilmemelidir, çünkü HTTP düzeyinde davranışın farklı olması HTML uygulayan kullanıcı aracıları kullanmayan kullanıcı aracılarına göre.
Kornel

3
Alıntılanan belge, no-storedeğere göre doğru değil (belgenin kendisi RFC 2068'e gönderme yapmasına rağmen ) - no-storebelgenin herhangi bir yerde saklanmasını / önbelleğe alınmasını önler. Oysa no-cachedepolanmasına izin verir, ancak sunucuya her seferinde kontrol etmelidir. Tarayıcılar, geri düğmesi işlevini vb. Etkinleştirmek için no-cachesayfaları saklama eğilimindedir .
MrWhite

3
Google, HTTP önbelleğe alma
IMO'su

137

Şunları yapabilirsiniz PHP'de başlıklarını ayarlamak kullanarak:

<?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)

?>

Kullanılan tam başlıkların ihtiyaçlarınıza bağlı olacağını unutmayın (ve HTTP 1.0 ve / veya HTTP 1.1'i desteklemeniz gerekiyorsa )


3
Pragmave Expiresmuhtemelen tarayıcıların büyük çoğunluğu için gereksizdir. fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai yeah HTTP / 1.0 da güncelliğini yitirdi ... yalnızca kullanıcı matrisinize göre ihtiyacınız olan başlıkları kullanın
scunliffe

50

Yazdığım gibi dosyayı kullanmak en iyisidir .htaccess. Ancak içeriği önbellekte bıraktığınız zamanlara dikkat edin.

kullanın:

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

Nerede: 604800 = 7 gün

Not: Bu, herhangi bir başlığı sıfırlamak için kullanılabilir


30

Http://www.askapache.com/htaccess/apache-speed-cache-control.html adresindeki sayfa böyle bir şey kullanmanızı önerir:

Önbellek Denetimi Üstbilgileri Ekleme

Bu, kök .htaccess dosyanıza gider, ancak httpd.conf'a erişiminiz varsa bu daha iyidir.

Bu kod, belirli dosyalara Önbellek Denetimi Üstbilgileri eklemek için FilesMatch yönergesini ve Üstbilgi yönergesini kullanır.

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

3
Buradaki düzen önemli mi? "max-age = 290304000, herkese açık" Veya "herkese açık, max-age = 290304000" veya her ikisi de eşit derecede doğru mu?
Satya Prakash

2
Değerler birbiriyle çelişmiyorsa ( cacheve gibi no-cache) önemli değildir. max-ageve publicanlaşmazlık bu yüzden düzen önemli değil.
Blaise

1
Yönergeyi kullandığından, Headeretkinleştirmeniz gerektiğini unutmayın mod_headers.
Skippy le Grand Gourou

@Skippy le Grand Gourou mod_headers'ı nasıl etkinleştirebilirim?
Sam

@SamuelStratford Ben diğer dağıtımlarında farklılık okudum, ama Debian altında sen birini kullanabilirsiniz a2enmodveya sembolik bir bağlantı yapmak /etc/apache2/mods-available/headers.loadiçin /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou

21

Bu, .htaccessgerçek web sitemde kullandığım en iyisi :

<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
Neredeyse mükemmel bir .htaccess dosyası örneği ... Belirli görüntüler eklenmişse ve görüntünün yolunu nasıl yazacağınız VE .htaccess dosyasını nereye koyacağınız (ör. İmage dir veya index dir)? .Örneğin. '<IfModule mod_headers.c> <Dosyalar /img/myimage.jpg> Üstbilgi Önbellek Denetimi "max-age = 3600, mutlaka yeniden doğrula" </Files> </IfModule>' ... ekler mi? .. VEYA ... veya img dizinine yapıştırıldı '<filesmatch "^ (örnek \ .jpg | sample \ .png) $"> Üstbilgi Önbellek Denetimi'ni ayarla "max-age = 31536000, public" </filesmatch>' .. . bir hepsi aynı strateji riskli görünüyor - yine özel örnekler çok iyi olurdu poss eğer
Marco-UandL

2
sadece FYI: JS ve CSS dosyalarında gzip sıkıştırması SSL şifrelemenizi kırmanıza yardımcı olabilir. Güvenliğe güveniyorsanız,
Eduard Void

1
Bu, giriş hesabı sayfasını önbelleğe aldığından hesabınızdan çıkış yapamazsınız. Daha da kötüsü, birisi sadece hesap sayfasına erişemez ve son kullanıcı girişiyle giriş yapamaz. Bir e-Ticaret sitesinde kullanılması önerilmez, ardından <filesMatch "\.(x?html?|php)$">statik HTML sayfalarının önbelleğe alınmasını önlemek için öğesini kaldırmanız gerekir . Dosyaların geri kalanı tamam.
nicoX

1
Çoğalttınız <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
nicoX

2
Proxy önbelleklemeniz varsa cssve jsözel olarak ayarlanır . Bağlantınızda bununla ilgili herhangi bir öneri bulamadım. Çoğu CDN bu değerleri önbelleğe almanızı önerir.
nicoX

14

Apache sunucusu için, mod_expires'in Expires ve Cache-Control başlıklarını ayarlayıp ayarlamadığını kontrol etmelisiniz .

Alternatif olarak, kendi başınıza Cache-Control eklemek için Header yönergesini kullanabilirsiniz :

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

5

Meta önbellek kontrol etiketi, Web yayıncılarının sayfaların önbellekler tarafından nasıl ele alınacağını tanımlamasına olanak tanır. Nelerin önbelleğe alınabileceğini, önbelleklerle nelerin depolanabileceğini, son kullanma mekanizmasının değiştirilmesini ve yeniden doğrulama ve yeniden yükleme kontrollerini bildirmek için yönergeler içerir.

İzin verilen değerler:

Genel - ortak paylaşılan önbelleklerde önbelleğe
alınabilir Özel - yalnızca önbellek
no önbellekte önbelleğe alınabilir
- Mağaza önbelleğe alınamaz - önbelleğe alınabilir ancak arşivlenemez

Lütfen büyük / küçük harf duyarlılığı konusunda dikkatli olun. Aşağıdaki meta etiketi web sayfanızın kaynağına ekleyin. Etiketin sonundaki yazım farkı, "/> = xml veya"> = html kullanmanızdır.

    <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">

Kaynak-> MetaTags


düzeltme: mağaza önbelleğe alınmamalı, önbellek önbelleğe alınmasına izin verilmez, ancak ayrılmadan önce sunucuyla denetlenmelidir - bkz. palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse

Önbellek Denetimi depo yok - depo yok önbelleğe benzemez, çünkü yanıt önbelleğe alınamaz ve tekrar kullanılamaz, ancak önemli bir fark vardır. no-store kaynağın her seferinde kaynak sunucudan istenmesini ve indirilmesini gerektirir. Bu, özel bilgilerle uğraşırken önemli bir özelliktir.
MarcoZen

5

OWASP aşağıdakileri önerir,

Mümkün olduğunda, önbellek denetimi HTTP üstbilgisinin önbellek yok, depo yok, yeniden doğrulamalı, özel olarak ayarlandığından emin olun; ve pragma HTTP üstbilgisinin önbelleksiz olarak ayarlandığını.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.