Ana içeriğe geç

Rehberler / Düzeltin: insanların gerçekten karşılaştığı hatalar için rehberler

ERR_CACHE_MISS: ne anlama gelir ve nasıl düzeltilir

ERR_CACHE_MISS, Chrome'un sayfanın kayıtlı bir kopyasına ihtiyaç duyduğu ama önbelleğinde böyle bir kopya bulamadığı anlamına gelir. En sık, bir form gönderiminin oluşturduğu sayfada Geri veya Yeniden Yükle düğmesine bastığınızda ortaya çıkar; Chrome bu durumda sayfayı "Confirm Form Resubmission" başlığıyla gösterir.

ERR_CACHE_MISS ne anlama gelir

Chrome, Edge, Brave ve Opera'nın arkasındaki motor olan Chromium, CACHE_MISS (-400) hatasını "The cache does not have the requested entry." (önbellekte istenen girdi yok) olarak tanımlar. Önbellekte bir girdinin bulunmaması normalde sorun değildir, çünkü tarayıcı sorusunu doğrudan sunucuya yöneltir. Hata yalnızca tarayıcıya yanıtı önbellekten vermesi ve ağı kullanmaması söylendiğinde görülür. Chromium kaynak kodunda bu, LOAD_ONLY_FROM_CACHE yükleme bayrağıdır ve önbellek isteği karşılayamazsa başarısız olan bir gezinme olarak tarif edilir. Önbellek yanıt veremeyince yükleme ERR_CACHE_MISS ile sona erer ve sunucuya hiçbir istek gitmez.

Yalnızca önbellekten yapılan bir yüklemeye iki yaygın durumda rastlanır. Birincisi, bir POST isteğinin oluşturduğu sayfaya geçmişte geri veya ileri gitmektir. Chrome bir POST isteğini kendiliğinden yeniden göndermez, çünkü tekrarlanan bir POST, ikinci bir sipariş, ödeme ya da mesaj gibi işlemi bir kez daha yapabilir. Chromium'un hata sayfası kodundaki bir yorum bu durumu "navigating through the history to an uncached page created by a POST" (geçmişte, bir POST'un oluşturduğu ve önbelleğe alınmamış bir sayfaya gitmek) diye açıklar. İkinci durum, gömülü tarayıcı motoruna ağa çıkmamasını söyleyen bir uygulamadır; örneğin WebView'ı yalnızca önbellek modunda çalıştıran bir Android uygulaması.

Girdi, tarayıcı yanıtı hiç saklamadığı için ya da sonradan silindiği için eksik olabilir. Cache-Control: no-store içeren bir yanıt hiçbir zaman saklanmaz: RFC 9111 bir önbelleğin isteğin veya yanıtın hiçbir parçasını saklamaması gerektiğini söyler ve Chromium no-store içeriği kaydetmez. Form gönderimi ile Geri düğmesine basma arasında tarama verilerini temizlemek de girdileri siler. Chrome disk önbelleğini hiç açamıyorsa, örneğin disk dolu olduğu için ya da başka bir program önbellek dosyalarını kilitlediği için, hiçbir şey saklanmaz ve yalnızca önbellekten yapılan bir yükleme okuyacak bir şey bulamaz.

Hata nasıl görünür

Masaüstü tarayıcıda Geri veya Yeniden Yükle'ye basarsınız ve "Confirm Form Resubmission" başlıklı bir sayfa görürsünüz. Sayfa, daha önce girdiğiniz verilere ihtiyaç duyduğunu ve verileri yeniden göndermenin sayfanın az önce yaptığı işlemi tekrarlayacağını söyler. Verileri yeniden göndermek için tarayıcının yeniden yükleme düğmesine basmanızı ister. En altta ERR_CACHE_MISS yazar. Edge, Brave, Opera ve diğer Chromium tabanlı tarayıcılar aynı sayfayı gösterir. DevTools'ta Network paneli, sayfa isteğini net::ERR_CACHE_MISS ile başarısız olarak listeler.

Android geliştiricileri hatayı kendi kodlarında görür. WebView hatayı onReceivedError üzerinden bildirir:

webView.webViewClient = object : WebViewClient() {
    override fun onReceivedError(
        view: WebView, request: WebResourceRequest, error: WebResourceError
    ) {
        if (request.isForMainFrame) {
            Log.w("WebView", "${request.url}: ${error.description}")
            // https://example.com/: net::ERR_CACHE_MISS
        }
    }
}

Koddaki yorum, alacağınız günlük satırının biçimini gösterir.

ERR_CACHE_MISS ile benzer hatalar

ERR_CACHE_MISS, bu tabloda tarayıcının ağı bilerek denemediği tek hatadır. Diğerleri denerken başarısız olmuştur ya da cihazın deneyebileceği bir bağlantı yoktur. Parantezli sayılar Chromium'un iç hata kodlarıdır.

HataAğ veya protokol düzeyinde ne olduİlk bakılacak yer
ERR_CACHE_MISS (-400)Tarayıcı yalnızca önbelleğini kullanabiliyordu ve önbellekte girdi yoktu. Sunucuya hiçbir istek ulaşmadı.İlk yanıtın Cache-Control başlığı, sayfayı bir POST'un oluşturup oluşturmadığı, uygulamanın önbellek modu.
ERR_CACHE_READ_FAILURE (-401)Önbellekte bir girdi var ama disk önbelleği onu okuyamadı.Bozuk tarayıcı önbelleği veya disk hataları. Önbelleğe alınmış dosyaları temizlemek genellikle çözer.
ERR_CLEARTEXT_NOT_PERMITTED (-29)Android, uygulamanın ağ güvenliği ilkesi nedeniyle bir http:// isteğini engelledi.Uygulama manifestindeki veya ağ güvenliği yapılandırmasındaki cleartext ayarları.
ERR_INTERNET_DISCONNECTED (-106)İşletim sistemi, internet bağlantısının koptuğunu bildiriyor.Wi-Fi, kablo, uçak modu, yönlendirici.
ERR_NAME_NOT_RESOLVED (-105)DNS sorgusu kullanılabilir bir IP adresi döndürmedi, bu yüzden bağlantı denenmedi.Alan adının DNS kayıtları ve cihazın çözümleyicisi.
ERR_CONNECTION_TIMED_OUT (-118)SYN paketi gitti ve istemci vazgeçene kadar hiçbir şey dönmedi.Paketleri düşüren güvenlik duvarları ve sunucunun ayakta olup olmadığı.

ERR_CACHE_MISS'e ne sebep olur

  • Bir form POST'unun oluşturduğu sayfada Geri veya Yeniden Yükle. En yaygın neden budur.
  • Cache-Control: no-store içeren bir yanıt. Chrome onu saklamadı, bu yüzden Geri'ye basınca gösterilecek bir kopya yok.
  • Kimse seçmediği halde no-store ekleyen bir framework. PHP oturumları varsayılan olarak bunu yapar (aşağıdaki sunucu bölümüne bakın); birçok uygulamanın giriş ve yönetim alanları da no-store gönderir.
  • Artık eşleşmeyen bir Vary başlığı. Yanıtın değiştiği bir istek değeri, örneğin bir çerez, sayfa saklandıktan sonra değiştiyse Chromium saklanan kopyayı uyumsuz sayar.
  • Temizlenmiş ya da kullanılamayan bir önbellek: gönderimden sonra silinen tarama verileri, dolu bir disk veya Chrome profil klasöründeki dosyaları kilitleyen güvenlik yazılımı.
  • Başlıkları değiştiren ya da önbelleği yöneten bir eklenti. Gizli pencerede denemek, bir eklentinin işin içinde olup olmadığını gösterir.
  • Önbellek modu LOAD_CACHE_ONLY olan veya ağ yüklemeleri engellenmiş bir Android WebView. Uygulamada INTERNET izni yoksa WebView ağ yüklemelerini varsayılan olarak engeller.

Sunucu tarafı nedenler ve yapılandırma

Site sahibi, ziyaretçinin önbelleğini temizleyemez. Geri düğmesinin çalışıp çalışmayacağını sunucudaki iki şey belirler: form akışının bir POST'a nasıl yanıt verdiği ve sayfaların hangi önbellek başlıklarını taşıdığı.

Sayfanın gönderdiği başlıkları okuyun

Formu curl ile gönderin ve yalnızca yanıt başlıklarını yazdırın:

curl -s -D - -o /dev/null -d 'name=test' https://example.com/submit
HTTP/2 200
content-type: text/html; charset=UTF-8
cache-control: no-store, no-cache, must-revalidate
pragma: no-cache

İkinci blok hataya yol açan bir yanıtı gösterir, çünkü no-store her önbelleğe hiçbir şey saklamamasını söyler. Başlığı ekleyebilecek her katmanı kontrol edin: uygulama, web sunucusu (grep -rn "no-store" /etc/nginx/), CDN kuralları ve sitenin önündeki her ters proxy.

303 ile POST sonrası yönlendirme

En güvenilir çözüm başlığı değil, akışı değiştirmektir. POST isteğine, normal bir GET sayfasına yönlendirmeyle yanıt verin. Tarayıcı bu durumda sıradan bir GET sonucu saklar ve Geri ile Yeniden Yükle hiçbir zaman POST'u tekrarlamak zorunda kalmaz. Bu, Post/Redirect/Get desenidir ve 303 See Other durum kodu tam olarak bunun için vardır. Express'te:

app.post('/checkout', async (req, res) => {
  const order = await createOrder(req.body);
  res.redirect(303, `/orders/${order.id}`);
});

PHP'de:

<?php
// ...formu işleyin, sonra:
header('Location: /thanks', true, 303);
exit;

Sunucu tarafında çift gönderime karşı bir koruma bulundurun; tek kullanımlık bir form belirteci ya da benzersiz bir sipariş anahtarı gibi. Ziyaretçiler çift tıklar.

PHP oturumları ve diğer framework varsayılanları

PHP'nin session.cache_limiter ayarının varsayılan değeri nocache'tir. Bu ayarla session_start(), oturum başlatan her sayfada Cache-Control: no-store, no-cache, must-revalidate gönderir. PHP kılavuzu, alternatif olarak Cache-Control: private, max-age=... gönderen private_no_expire değerini listeler (süre session.cache_expire ayarından gelir, varsayılan 180 dakikadır). Sınırlayıcıyı boş bir dizeye ayarlamak otomatik başlıkları kapatır, böylece kendi başlıklarınızı gönderebilirsiniz:

<?php
session_cache_limiter('');   // PHP'nin kendi önbellek başlıklarını eklemesini durdur
session_start();
header('Cache-Control: private, no-cache');

private, no-cache, tarayıcının bir kopya tutmasına izin verir ama normal bir yükleme için kopyayı yeniden kullanmadan önce doğrulama ister. Bunu yalnızca ziyaretçinin diskinde tutulması sakıncasız olan sayfalarda kullanın. Hesap bilgileri veya ödeme içeren sayfalar no-store kalmalıdır. Bunun bedeli, bu sayfalarda Geri düğmesinin kayıtlı bir kopya gösterememesidir; yukarıdaki yönlendirmeyi kullanmanın bir nedeni de budur.

Android WebView

Bir Android uygulamasındaki iki ayar bu hataya yol açar. Birincisi, manifestte INTERNET izni gerekir. Android belgeleri, uygulamada bu izin yoksa setBlockNetworkLoads değerinin varsayılan olarak true olduğunu söyler ve Chromium bu ayarı yalnızca önbellekten yükleme olarak uygular:

<uses-permission android:name="android.permission.INTERNET" />

İkincisi, önbellek modunu kontrol edin. Belgeler LOAD_CACHE_ONLY değerini "Don't use the network, load from the cache" (ağı kullanma, önbellekten yükle) olarak tarif eder; bu yüzden önbellekte olmayan her sayfa ERR_CACHE_MISS ile başarısız olur:

val settings = webView.settings
settings.cacheMode = WebSettings.LOAD_DEFAULT          // geçerliyse önbellek, değilse ağ
// Çevrimdışına uygun: süresi dolmuş olsa bile önbellekteki kopya, yoksa ağ
// settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
settings.blockNetworkLoads = false   // izin yoksa SecurityException fırlatır

Sayfaları Android WebView ile gösteren framework'ler de aynı Android kuralına uyar. Örneğin Flutter belgeleri, Android uygulamalarının internet kullanımını AndroidManifest.xml dosyasında bildirmesi gerektiğini söyler.

Dışarıdan nasıl görünür

ERR_CACHE_MISS tek bir ziyaretçinin tarayıcısından gelir, bu yüzden dış bir kontrol onu yeniden üretmez. Kontrolün gösterdiği, sayfanın o anda sağlıklı olup olmadığıdır. Şu örüntüleri karşılaştırın:

  • Her kontrol noktası sayfayı alıyor ama ziyaretçiler Geri'den sonra hatayı görüyor. Sunucu sağlam; form akışına ve önbellek başlıklarına bakın.
  • Bildirimler bir dağıtımdan veya CDN değişikliğinden hemen sonra başlıyor. Yeni bir kural ya da framework güncellemesi büyük olasılıkla no-store ekledi. Kaynak sunucudan ve herkese açık adresten gelen başlıkları curl -I ile karşılaştırın.
  • Yalnızca Android uygulamanızın kullanıcıları bildiriyor. Neden sunucuda değil, uygulamanın WebView ayarlarındadır.
  • Sayfa kontrol noktalarından da açılmıyor. Bu farklı bir sorundur ve başlangıç noktası "This site can't be reached" rehberidir.

HTTP denetleyicisi, bir sunucunun HTTP durumunu, yanıt süresini ve erişilebilirliğini dünyanın dört bir yanındaki konumlardan kontrol eder ve ilk durumu hızla doğrular.

ERR_CACHE_MISS nasıl düzeltilir

Ziyaretçiyseniz

  1. Bir formun sonucuna dönmek için Geri'yi kullanmayın. Sayfayı sitenin menüsünden yeniden açın ya da adresi yazın. Bu, normal bir GET isteği gönderir.
  2. Yeniden göndermeden önce düşünün. Yeniden Yükle, form verilerini bir kez daha gönderir. Bir arama veya oturum açma için sorun yoktur. Ödeme, sipariş veya yorum için önce sipariş geçmişine ya da sitenin kendisine bakıp ilk gönderimin işe yarayıp yaramadığını görün.
  3. Gizli pencere deneyin. Ctrl+Shift+N (Windows, Linux) veya Cmd+Shift+N (macOS) tuşlarına basın. İzin vermediyseniz eklentiler orada kapalıdır. Hata kayboluyorsa eklentileri chrome://extensions sayfasından tek tek kapatın.
  4. Önbelleğe alınmış dosyaları temizleyin. Ctrl+Shift+Delete (macOS'ta Cmd+Shift+Delete) tuşlarına basın, "Önbelleğe alınmış resimler ve dosyalar" seçeneğini işaretleyip temizleyin. Önbellek bozuksa yardımcı olur, ama terk ettiğiniz bir sayfayı geri getiremez.
  5. Disk alanı açın ve Chrome'u yeniden başlatın. Dolu bir disk, tarayıcıyı çalışan bir önbellek olmadan bırakabilir.
  6. Chrome'u güncelleyin: chrome://settings/help sayfasından güncelleyin, sonra yeniden deneyin.
  7. Bir Android uygulamasındaysanız uygulamayı ve cihazınız listeliyorsa Android System WebView'ı Google Play'den güncelleyin; uygulamanın mobil veri ve Wi-Fi kullanmasına izin verildiğinden emin olun.

Siteyi siz işletiyorsanız

  1. Ziyaretçilerin hangi sayfadan geldiğini öğrenin. Bir formun sonucuysa, akışı 303 ile Post/Redirect/Get olarak değiştirin.
  2. Başlıkları okuyun: yukarıdaki curl komutuyla bakın ve ihtiyaç duymayan sayfalardan no-store değerini kaldırın.
  3. Framework varsayılanlarını kontrol edin; PHP oturum sınırlayıcısı, CMS önbellek eklentisi ayarları ve CDN kuralları gibi.
  4. Bir Android uygulaması için INTERNET iznini ekleyin, LOAD_CACHE_ONLY dışında bir önbellek modu ayarlayın ve ana çerçeve için onReceivedError çıktısını günlüğe yazın.
  5. Temiz bir Chrome profilinde yeniden test edin: formu gönderin, Geri'ye basın ve normal bir sayfaya ulaştığınızı doğrulayın.

İzleme neyi gösterebilir, neyi gösteremez

Bir izleme kontrolü Geri düğmesine basmaz, bu yüzden ERR_CACHE_MISS'i göremez. Gösterdiği şey, bir ziyaretçi denediğinde sitenin ayakta olup olmadığıdır. HostTracker web sitelerini 158 şehirdeki 300'den fazla kontrol noktasından kontrol eder ve e-posta, SMS, sesli arama, Slack, Telegram ve daha fazlasıyla uyarı gönderir. Bir ziyaretçi hata bildirirken tüm kontrol noktaları yeşilse sunucu sağlıklıydı; neden başlıklarda, form akışında ya da ziyaretçinin tarayıcısındadır.

Sık sorulan sorular

ERR_CACHE_MISS web sitesindeki bir sorun mu?

Genellikle hayır. Bu, tarayıcıdan gelen bir mesajdır. Bir site, form sonuçlarında no-store göndererek veya bir POST'a yönlendirme yerine bir sayfayla yanıt vererek hatayı daha yaygın hale getirebilir, ama site çökmüş değildir.

"Confirm Form Resubmission" sayfasında Yeniden Yükle'ye tıklamak güvenli mi?

Aynı form verilerini yeniden gönderir. Bir arama için zararsızdır. Bir sipariş, ödeme ya da mesaj için işlem iki kez gerçekleşebilir. Önce sitenin kendi geçmişine bakın.

Önbelleği temizlemek ERR_CACHE_MISS'i çözer mi?

Yalnızca önbelleğin kendisi bozuksa. Hata bir formdan sonra Geri'ye basmaktan geliyorsa, önbelleği temizlemek ihtiyaç duyacağınız girdileri de siler; bunun yerine sayfayı yeniden açın.

Bunu neden yalnızca Chrome'da görüyorum?

Diğer tarayıcılar aynı durumu kendi mesajlarıyla karşılar ve form sonuçlarını saklama ve yeniden kullanma konusunda kendi kuralları vardır. ERR_CACHE_MISS kodu Chromium ağ yığınına aittir; Edge, Brave ve Opera'nın da onu göstermesinin nedeni budur.

Android uygulamam neden net::ERR_CACHE_MISS gösteriyor?

WebView'a yalnızca önbelleğini kullanması söylenmiş. Olağan nedenler, ağ yüklemelerini varsayılan olarak engelleyen eksik INTERNET izni ve LOAD_CACHE_ONLY önbellek modudur. İzni veya modu düzeltin ve yeniden yükleyin.

Ziyaretçilerimin bir formdan sonra bunu görmesini nasıl engellerim?

POST isteğine, GET ile yüklenen bir sonuç sayfasına 303 yönlendirmesiyle yanıt verin. Bundan sonra Geri ve Yeniden Yükle normal bir sayfada çalışır ve yeniden gönderim hiç istenmez.

"Confirm Form Resubmission" ile ERR_CACHE_MISS aynı şey mi?

Evet. Başarısız olan sayfa bir POST'tan geldiğinde Chrome'un ERR_CACHE_MISS için gösterdiği özel sayfadır. Kod, o sayfanın en altında yazılıdır.

Kaynaklar ve ek okumalar

Şimdi kontrol edin

Ücretsiz kontrolü kendi sitenizde çalıştırın - hesap gerekmez.

HTTP check

Bunu sürekli izleyin

Bir sorun çıktığı anda haberdar olun: HostTracker 300’den fazla konumdan kontrol eder ve size e-posta, SMS, Slack, Telegram ve daha fazlasıyla bildirim gönderir.

HostTracker özellikleri

Bu bölümde daha fazlası: Düzeltin: insanların gerçekten karşılaştığı hatalar için rehberler