Add Expires Headers Hatası Nedir ve Nasıl Çözülür? Kapsamlı Site Hızlandırma Rehberi (2026)

E-posta Hosting Kampanya

Giriş: Performans Testlerinin Klasikleşen Uyarısı

Web sitenizin hızını ölçmek ve performans darboğazlarını tespit etmek için GTmetrix, Pingdom, WebPageTest veya Google PageSpeed Insights gibi analiz araçlarını kullandığınızda, karşınıza sıkça çıkan ve genellikle kırmızı harflerle puanınızı düşüren inatçı bir uyarı vardır: “Add Expires Headers” (Süre Sonu Başlıkları Ekleyin). Modern araçlarda bu uyarı bazen “Serve static assets with an efficient cache policy” (Statik öğeleri verimli bir önbellek politikasıyla sunun) şeklinde de karşınıza çıkabilir.

Bir web sitesi sahibi olarak bu uyarıyı gördüğünüzde, sitenizin teknik altyapısında eksik bir parça olduğunu ve bu eksikliğin sitenizin yavaş açılmasına neden olduğunu fark edersiniz. 2026 yılının yüksek hızlı internet ekosisteminde, bir kullanıcının sitenize her girişinde aynı logoyu, aynı arka plan resmini ve aynı CSS dosyalarını sunucunuzdan defalarca, sıfırdan indirmesi hem bant genişliğiniz (bandwidth) için devasa bir israf hem de ziyaretçi için zaman kaybıdır.

Bu derinlemesine teknik rehberde; “Add Expires Headers” uyarısının tam olarak ne anlama geldiğini, internet tarayıcılarının (Chrome, Safari, Edge) önbellek (cache) mekanizmalarını nasıl kullandığını, Cache-Control ile Expires arasındaki farkları ve Apache, Nginx veya WordPress gibi farklı altyapılarda bu hatayı kod yazarak veya eklenti kullanarak nasıl kökünden çözeceğinizi tüm detaylarıyla inceliyoruz.

Gelişme: Expires Headers (Süre Sonu Başlıkları) Nedir?

Bir web sitesine girdiğinizde, tarayıcınız sunucuya bir istek (HTTP Request) gönderir. Sunucu da bu isteğe karşılık sayfanın içindeki HTML kodlarını, görselleri, fontları ve JavaScript dosyalarını tarayıcıya iletir (HTTP Response).

Expires Headers, sunucunun bu dosyaları tarayıcıya gönderirken paketlerin üzerine yapıştırdığı görünmez bir “Son Kullanma Tarihi” etiketidir. Sunucu tarayıcıya adeta şu mesajı verir: “Sana bu site logosunu (logo.webp) gönderiyorum. Üzerine bir Expires Header ekledim ve süresini 1 Yıl olarak belirledim. Lütfen bu logoyu kendi bilgisayarının/telefonunun hafızasına (Browser Cache) kaydet. Önümüzdeki 1 yıl boyunca bu kullanıcı benim siteme tekrar gelirse, bu logoyu benden (sunucudan) tekrar isteme, doğrudan kendi yerel hafızandan anında ekrana yansıt.”

Eğer sunucunuzda bu ayar yapılmamışsa (yani dosyaların üzerinde son kullanma tarihi etiketi yoksa), tarayıcı inisiyatif alamaz. Kullanıcı aynı sayfaya 5 dakika sonra bile girse, tarayıcı sunucuya gidip “Bu logo değişmiş olabilir, bana logoyu tekrar gönder” diyerek dosyayı sıfırdan indirir. Bu durum, sunucu kaynaklarınızı tüketir ve sayfa yüklenme (Page Load) süresini felç eder.

Cache-Control ve Expires Headers Arasındaki Teknik Fark

Analiz araçları ve dokümantasyonlar genellikle bu iki terimi aynı cümle içinde kullanır. İkisi de aynı amaca (Tarayıcı Önbellekleme – Browser Caching) hizmet etse de, çalışma mantıkları tarihsel olarak farklıdır.

  • Expires Headers: HTTP/1.0 protokolünün eski bir standardıdır. Tarih tabanlı çalışır. Sunucu tarayıcıya tam ve kesin bir tarih verir: “Bu dosyanın süresi 15 Aralık 2026, Saat 14:00’te dolacaktır.”
  • Cache-Control (max-age): HTTP/1.1 protokolünün modern ve daha güçlü standardıdır. Kesin bir tarih yerine, dosyanın indirildiği andan itibaren saniye cinsinden bir yaşam süresi (TTL) belirler: “Bu dosyayı indirdiğin andan itibaren 31536000 saniye (1 yıl) boyunca hafızanda tut.”

Sistem mimarı Timur, yönettiği haber portalının sunucu optimizasyonlarını yaparken modern tarayıcıların Cache-Control başlığına öncelik verdiğini bilir. Eğer bir dosyanın üzerinde hem Expires hem de Cache-Control (max-age) başlığı varsa, tüm modern tarayıcılar (Chrome, Firefox) Expires başlığını görmezden gelir ve Cache-Control saniyesine uyar. Ancak geriye dönük tam uyumluluk (Eski tarayıcılar ve çeşitli analiz araçlarının puanlama sistemleri) için her iki başlığın (header) aynı anda sunucuda aktif edilmesi en kusursuz çözümdür.

Hangi Dosya Türlerine Ne Kadarlık Bir Süre (TTL) Verilmelidir?

Sunucunuzdaki her dosyanın yapısı ve değişme sıklığı birbirinden farklıdır. Bu nedenle her dosyaya “1 yıl” önbellek süresi vermek, sitenizde yapacağınız bir tasarım değişikliğinin kullanıcılara 1 yıl boyunca yansımaması (eski tasarımın görünmesi) gibi ölümcül bir hata yaratabilir.

İdeal ve uluslararası standartlara uygun Expires yapılandırması şu şekildedir:

  1. Görseller ve Medya (Resimler, Videolar, Sesler): 1 Yıl (Logo, arka plan resmi veya bir makale görseli yüklendikten sonra nadiren değişir).
  2. Web Fontları (WOFF2, TTF vb.): 1 Yıl (Font dosyaları neredeyse hiçbir zaman değişmez).
  3. CSS ve JavaScript Dosyaları: 1 Ay ile 1 Yıl arası. (Tasarım kodları güncellendiğinde, geliştiriciler genellikle dosya isminin sonuna bir versiyon numarası ekleyerek style.css?v=2 tarayıcının önbelleğini kırarlar (Cache Busting). Bu sayede uzun süre verilse de risk alınmamış olur).
  4. HTML Dokümanları: 0 Saniye veya Hiçbir Zaman. Sitenizin ana iskeleti olan HTML dosyaları, içeriğin her an güncellenebilme ihtimaline karşı tarayıcı hafızasına uzun süreli hapsedilmemelidir.

Sunucu Seviyesinde Kesin Çözümler (Apache ve Nginx)

Bu hatayı çözmenin en temiz, en hızlı ve eklentilere bağlı kalmayan en profesyonel yolu, kuralları doğrudan web sunucusunun yapılandırma dosyalarına (konfigürasyonuna) yazmaktır.

1. Apache Sunucularında Çözüm (.htaccess Dosyası)

Eğer standart bir paylaşımlı barındırma hizmeti veya cPanel kullanıyorsanız, sunucunuz %90 ihtimalle Apache’dir. Bu işlemi yapabilmek için sunucunuzda mod_expires modülünün açık olması gerekir (Modern sunucularda varsayılan olarak açıktır).

Kişisel portfolyo sitesini yöneten Handan, FTP programı (veya Dosya Yöneticisi) aracılığıyla sitesinin ana dizininde bulunan .htaccess dosyasını açar ve en altına şu sihirli kod bloğunu ekler:

Apache

<IfModule mod_expires.c>
  # Expires modülünü aktif et
  ExpiresActive On

  # Varsayılan süre (1 Ay)
  ExpiresDefault "access plus 1 month"

  # Görseller ve Videolar (1 Yıl)
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType image/avif "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType video/mp4 "access plus 1 year"

  # Web Fontları (1 Yıl)
  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType font/woff "access plus 1 year"
  ExpiresByType application/x-font-ttf "access plus 1 year"

  # CSS ve JavaScript Dosyaları (1 Yıl)
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType text/javascript "access plus 1 year"

  # HTML ve Dinamik Sayfalar (Cache Yok)
  ExpiresByType text/html "access plus 0 seconds"
</IfModule>

Handan bu dosyayı kaydedip kapattığında, sunucu artık belirtilen dosya türlerine doğru “Son Kullanma Tarihi” etiketlerini yapıştırarak göndermeye başlar ve GTmetrix testindeki hata anında yok olur.

2. Nginx Sunucularında Çözüm

Eğer yüksek performanslı bir sanal sunucu (VPS) üzerinde Nginx kullanıyorsanız, .htaccess dosyası çalışmaz. İşlemi Nginx’in kendi yapılandırma dosyasından (nginx.conf veya sunucu bloğu / server block içinden) çözmeniz gerekir.

Yazılım geliştiricisi Reha, terminal üzerinden Nginx konfigürasyonunu açar ve server { ... } bloğunun içine şu satırları ekler:

Nginx

# Görseller, Fontlar ve Medya (1 Yıl)
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|webp|avif|woff|woff2|ttf)$ {
    expires 1y;
    access_log off;
    add_header Cache-Control "public";
}

# CSS ve Javascript Dosyaları (1 Yıl)
location ~* \.(?:css|js)$ {
    expires 1y;
    access_log off;
    add_header Cache-Control "public";
}

Reha, dosyayı kaydettikten sonra sudo systemctl reload nginx komutuyla sunucuyu yeniden yükler. Bu kod, hem Expires başlıklarını 1y (1 yıl) olarak belirler hem de Cache-Control "public" başlığını ekleyerek modern tarayıcılara dosyaların güvenle önbelleğe alınabileceği sinyalini verir.

WordPress Kullanıcıları İçin Eklentili (Kodsuz) Çözümler

Kod dosyalarına müdahale etmekten çekiniyorsanız, WordPress’in zengin eklenti dünyası bu sorunu tek tıkla çözmenize olanak tanır. Sitenizde WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Fastest Cache veya Autoptimize gibi popüler bir önbellek (Cache) eklentisi kuruluysa, bu eklentiler genellikle “Browser Caching” (Tarayıcı Önbellekleme) adında bir menü barındırır. Bu menüdeki butonu aktif hale getirdiğinizde, eklenti sizin yerinize yukarıda bahsettiğimiz .htaccess kodlarını arka planda otomatik olarak dosyaya yazar. Eğer hata devam ediyorsa, sunucunuzda (hosting tarafında) mod_expires kapalı olabilir, bu durumda sunucu yöneticinizle iletişime geçmeniz gerekir.

Üçüncü Taraf (Third-Party) Scriptlerin Yarattığı Çözümsüzlük

Web yöneticilerini performans testlerinde en çok çileden çıkaran durumlardan biri de, sitelerindeki tüm resimlere ve kodlara Expires başlığı eklemelerine rağmen hatanın bir türlü %100 temizlenmemesidir.

Dijital pazarlama uzmanı Belgin, GTmetrix test sonucunu incelerken “Add Expires Headers” uyarısının hala durduğunu, ancak hatayı veren dosyaların kendi sitesindeki resimler değil, şu dosyalar olduğunu fark eder:

  • [https://www.google-analytics.com/analytics.js](https://www.google-analytics.com/analytics.js)
  • [https://connect.facebook.net/en_US/fbevents.js](https://connect.facebook.net/en_US/fbevents.js)
  • [https://fonts.googleapis.com/css2](https://fonts.googleapis.com/css2)?...

Belgin’in bilmesi gereken temel kural şudur: Yalnızca kendi sunucunuzda barındırılan (kendi domaininize ait) dosyaların başlık (Header) ayarlarını değiştirebilirsiniz. Google Analytics, Facebook Pixel, YouTube Embed dosyaları veya harici canlı destek scriptleri, o firmaların kendi sunucularından gelmektedir. Google, kendi analytics.js dosyasına sadece 2 saatlik bir önbellek (cache) süresi atamıştır.

Bu durumda Belgin’in yapabileceği hiçbir sunucu ayarı yoktur. Google PageSpeed veya diğer test araçları bu dosyaları işaret ediyorsa, bunu bir hata olarak değil, dijital dünyanın bir “gerekliliği” olarak kabullenmelisiniz. (İleri düzey teknikler olan Script Locally Hosting – Dış scriptleri kendi sunucunuza indirip barındırma – yöntemleri bu sorunu çözebilir ancak dış scriptlerin güncellemelerini alamama gibi ciddi fonksiyonel riskler yaratır).

Sonuç: Tarayıcıların Hafızasına Hükmetmek

Web performansı, pikselleri ve kodları saniyelerle, hatta milisaniyelerle yarıştırma sanatıdır. Add Expires Headers hatasını çözmek, sunucunuzun üzerindeki amansız yükü kaldırıp bu yükü ziyaretçilerinizin cihazlarının (tarayıcılarının) kendi güçlü hafızalarına devretmek anlamına gelir.

Statik öğelerinize (resimler, fontlar, tasarım dosyaları) doğru son kullanma tarihleri atadığınızda; aynı ziyaretçi sitenize ikinci, üçüncü veya onuncu kez girdiğinde siteniz adeta bir ışık hızıyla, sunucuya hiç uğramadan saniyenin onda biri sürede ekrana çizilir. Kod dosyalarınıza ekleyeceğiniz 15-20 satırlık basit bir yönlendirme veya aktif edeceğiniz bir önbellek butonu, sadece o sinir bozucu GTmetrix/PageSpeed hatalarını silmekle kalmayacak, aynı zamanda bant genişliği (trafik) masraflarınızı düşürecek ve ziyaretçilerinize kusursuz bir gezinme deneyimi sunarak arama motorlarındaki otoritenizi taçlandıracaktır.