2009-06-25 5 views
19

(Yerleşik) web sunucumun Expires üstbilgisini gönderdiği bir durum var, ancak tarayıcı başlık ayarlarına uymuyor gibi görünüyor, yani sayfayı yenilediğimde, tarayıcı önbelleğe alınması gereken kaynakları ister. Aşağıdaki alışverişinde alıyorsanız başlıkları şunlardır: Ben önbelleğe edilmesini istediğinizHTTP Expires başlığı tarayıcı tarafından saygı görmüyor mu?

 
https://192.168.1.180/scgi-bin/ajax/ajax.cgi 

GET /scgi-bin/ajax/ajax.cgi HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Content-Type: text/html 
---------------------------------------------------------- 
https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 

GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: image/png,image/*;q=0.8,*/*;q=0.5 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: https://192.168.1.180/scgi-bin/ajax/ajax.cgi 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Expires: Wed, 1 Jun 2011 20:00:00 GMT 
Content-Type: image/jpg 
---------------------------------------------------------- 

ajax.cgi (static.cgi komut dosyası yoluyla) bir logo grafik ile bir html sayfa döndürür, ancak tarayıcı istiyor Her yenilemede logo.

+0

Sana HTTPS üzerinden çalışıyoruz bkz bakın. Önbelleğe alma beklediğiniz gibi yapılmamasının nedeni bu olabilir mi? Sadece bir HTTP sürümünü deneyebilir misiniz? – mark

cevap

13

Tarayıcınızda ne yapıyorsunuz? Yeniden yükle düğmesini veya vardiya + Yeniden Yükle gibi bir şeyi tıklıyor gibiyim. Normalde, tarayıcı bir Cache-Control: max-age=0 başlığı göndermez. Bu, tarayıcının önbelleğe alınmış görüntüyü attığı ve tekrar elde etmek istediği anlamına gelir.

Başka bir sayfaya gidip tekrar geri dönerseniz, tarayıcı Expires başlığınıza saygı göstermelidir.

Ayrıca, yanıtınıza bir Cache-control: public başlığı ekleyebilirsiniz. Bu, proxy'lere ve tarayıcıya resmi önbelleğe almayı açıkça sağlar.

+1

Bu kesinlikle doğru görünüyor. Tarayıcı (Firefox?) Max-age = 0 gönderiyor, yani 0'dan daha büyük bir yanıt istemiyor, yani orijinallik web sunucusuna vurmak istiyor. Bu "yenileme" nin tanımıdır. Sayfanızdan uzaklaşın, ardından tekrar URL'ye yapıştırın ve ne olduğunu görün. –

+0

Gerçekten de, bir sayfa yeniden yükleme yapıyordum ve tarayıcının html'yi yeniden yüklemesini bekledim, ancak önbelleğe alınmış tüm kaynakları da değil. Tarayıcıyı tüm kaynaklarda önbelleği geçersiz kılmak için zorlamak için vardiya tıklamanız (ya da kontrol tıklatmanız mı hatırlamıyorsunuz) gerektiğini düşündüm. Sanırım anlayışım yanlış mı? – user128602

+0

Bu konuda da emin değilim. Bence tarayıcılar, Shift ile/Shift olmadan F5/Reload düğmesine farklı şekilde davranır. – chris166

0

CGI betiği bir zaman damgası parametresine sahip gibi görünüyor ... bu değişmiyor, değil mi? Tarayıcı, her benzersiz URL'yi önbellekte farklı bir nesne olarak ele almalıdır. Bu, her istekle güncelleniyorsa, önbelleğe alınan görüntüyle eşleşmez.

Ayrıca, Tarih için iki haneye ihtiyacınız olduğundan, Geçerlilik alanı tam olarak RFC 1123 biçiminde değildir. Bu bir sorun olabilir veya olmayabilir, ancak kontrol edilmesi gereken bir şey. Tarayıcı, önbelleğinin potansiyel olarak güncel olmadığını düşündüğüne işaret eden Cache-Control: max-age=0 içeriyor.

Sunucu, bu doğrulama isteğini aldığında, şu anda olduğu gibi 304 (Not Modified) veya 200 (OK) döndürebilir.

+0

Hayır, zaman damgası değişmiyor. Ve Geçerlilik tarihi biçimindeki ipucu için teşekkürler, iki kez kontrol edeceğim. – user128602

16

Tarayıcı sayfayı yeniliyorsa, Expires başlığını yok sayar. Her zaman, önbellek girdisinin web sunucusuyla iletişim kurarak geçerli olup olmadığını kontrol eder. İdeal olarak, eğer Önbellek girişi hala geçerli ise, 'Modifiye-Olduğundan itibaren istek üstbilgisini' sunucu değiştirilemedi 'şeklinde başlatacaktır.

Last-Modified başlığını ayarlamıyorsunuz, dolayısıyla tarayıcının güncel olduğundan emin olmak için içeriğin koşulsuz bir GET yapması gerekiyor. ayarı için baş parmak

bazı kurallar Expires ve Last-Modified Bu blog yayınında açıklanmıştır: senin https sertifikada

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

+3

"Tarayıcı sayfayı yeniliyorsa, Expires başlığını yok sayar." Teşekkür ederim! Bunu bilmiyordum. –

+2

Hangi tarayıcı bu? – Pacerier

0

hatalar tarayıcı üstbilgilerinizi saygı duymayan neden olur.

https olmadan deneyin ve düz http üzerinde çalışıp çalışmadığını görün.

Bu cevap https://stackoverflow.com/a/17716911