{"id":3574,"date":"2025-12-28T15:42:38","date_gmt":"2025-12-28T12:42:38","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/tarayici-ve-cdn-onbellekleme-neden-bu-kadar-kritik\/"},"modified":"2025-12-28T15:42:38","modified_gmt":"2025-12-28T12:42:38","slug":"tarayici-ve-cdn-onbellekleme-neden-bu-kadar-kritik","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/tarayici-ve-cdn-onbellekleme-neden-bu-kadar-kritik\/","title":{"rendered":"Taray\u0131c\u0131 ve CDN \u00d6nbellekleme Neden Bu Kadar Kritik"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><p>{<br \/>\n  &#8220;title&#8221;: &#8220;HTTP Cache-Control, ETag ve CDN \u00d6nbellek Kurallar\u0131: WordPress, Laravel ve SPA Projeleri \u0130\u00e7in Uygulamal\u0131 Rehber&#8221;,<br \/>\n  &#8220;content&#8221;: &#8220;<\/p>\n<p>Bir WordPress sitesi, bir Laravel API projesi veya modern bir React SPA uygulamas\u0131 geli\u015ftirirken performans konu\u015fulan her toplant\u0131da \u015fu soru mutlaka gelir: Taray\u0131c\u0131 ve CDN \u00f6nbelle\u011fini do\u011fru ayarlasak bu site ne kadar h\u0131zlan\u0131r ve altyap\u0131 maliyeti ne kadar d\u00fc\u015fer? HTTP Cache-Control ba\u015fl\u0131klar\u0131, ETag ve CDN taraf\u0131ndaki \u00f6nbellek kurallar\u0131 do\u011fru kurguland\u0131\u011f\u0131nda, hem Core Web Vitals skorlar\u0131n\u0131z iyile\u015fir hem de sunucular\u0131n\u0131z gereksiz y\u00fckten kurtulur. DCHost ekibi olarak sahada en \u00e7ok g\u00f6rd\u00fc\u011f\u00fcm\u00fcz problemlerden biri, bu ba\u015fl\u0131klar\u0131n ya gere\u011finden agresif ya da tamamen kapal\u0131 kullan\u0131lmas\u0131. Sonu\u00e7; ya eski i\u00e7erik g\u00f6steren sayfalar ya da her istekte sunucuyu yoran dinamik cevaplar oluyor.<\/p>\n<p>n<\/p>\n<p>Bu yaz\u0131da HTTP Cache-Control, ETag ve CDN \u00f6nbellek kurallar\u0131n\u0131; WordPress, Laravel ve SPA (React, Vue, Angular) projeleri \u00f6zelinde, ger\u00e7ek\u00e7i senaryolarla ele alaca\u011f\u0131z. Hangi dosyay\u0131 ne kadar s\u00fcre cachelemek mant\u0131kl\u0131, HTML sayfalarda ne kadar agresif olunabilir, API cevaplar\u0131nda ETag ne i\u015fimize yarar, CDN kural\u0131 ile origin sunucu ayarlar\u0131 nas\u0131l uyumlu olmal\u0131 tek tek \u00fczerinden ge\u00e7ece\u011fiz. Anlat\u0131m boyunca DCHost altyap\u0131s\u0131nda uygulad\u0131\u011f\u0131m\u0131z pratiklerden, s\u0131k g\u00f6rd\u00fc\u011f\u00fcm\u00fcz hatalardan ve bunlar\u0131 nas\u0131l d\u00fczeltti\u011fimizden bahsedece\u011fim.<\/p>\n<p>nnn<\/p>\n<p>\u00d6nbellekleme, site h\u0131z\u0131n\u0131n ve altyap\u0131 maliyetinin en b\u00fcy\u00fck kald\u0131ra\u00e7lar\u0131ndan biri. \u00d6zellikle medya ve statik dosya a\u011f\u0131rl\u0131kl\u0131 projelerde, do\u011fru HTTP ba\u015fl\u0131klar\u0131 ile hem son kullan\u0131c\u0131n\u0131n ya\u015fad\u0131\u011f\u0131 gecikmeyi hem de sunucu CPU ve disk IO t\u00fcketimini dramatik bi\u00e7imde azaltmak m\u00fcmk\u00fcn. Bu etkiyi en net \u015fekilde Core Web Vitals metriklerinde g\u00f6r\u00fcrs\u00fcn\u00fcz. Taray\u0131c\u0131, CSS ve JS dosyalar\u0131n\u0131 her sayfa y\u00fcklemesinde yeniden indirmek zorunda kalmad\u0131\u011f\u0131nda LCP ve FID de\u011ferleri belirgin bi\u00e7imde iyile\u015fir. Bu konuyu daha derinlemesine okumak isterseniz, <a href='https:\/\/www.dchost.com\/blog\/core-web-vitals-ve-hosting-altyapisi-ttfb-lcp-ve-clsyi-sunucu-tarafinda-iyilestirme-rehberi\/'>Core Web Vitals ve hosting altyap\u0131s\u0131n\u0131n etkile\u015fimi<\/a> ba\u015fl\u0131kl\u0131 rehberimize g\u00f6z atabilirsiniz.<\/p>\n<p>n<\/p>\n<p>Di\u011fer tarafta CDN kullan\u0131yorsan\u0131z, edge sunuculardaki cache hit oran\u0131 do\u011frudan faturan\u0131za ve origin sunucular\u0131n\u0131z\u0131n stabilitesine yans\u0131r. K\u00f6t\u00fc kurgulanm\u0131\u015f Cache-Control ba\u015fl\u0131klar\u0131, CDN katman\u0131n\u0131n HTML ve API cevaplar\u0131n\u0131 yanl\u0131\u015f \u015fekilde cachelemesine, kullan\u0131c\u0131 ba\u015f\u0131na ki\u015fiselle\u015ftirilmi\u015f i\u00e7eriklerin kar\u0131\u015fmas\u0131na ve login sayfalar\u0131n\u0131n statikmi\u015f gibi saklanmas\u0131na neden olabilir. Bu y\u00fczden, taray\u0131c\u0131 \u00f6nbelle\u011fini d\u00fc\u015f\u00fcn\u00fcrken her zaman CDN ile beraber, u\u00e7tan uca bir strateji kurmak gerekiyor. DCHost taraf\u0131nda, y\u00fcksek trafikli WordPress ve Laravel projelerinde mimari tasar\u0131m yaparken ilk bakt\u0131\u011f\u0131m\u0131z maddelerden biri, HTTP \u00f6nbellek ba\u015fl\u0131klar\u0131n\u0131n haritas\u0131d\u0131r.<\/p>\n<p>nn<\/p>\n<div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#HTTP_Cache-Control_Direktiflerini_Dogru_Okumak\"><span class=\"toc_number toc_depth_1\">1<\/span> HTTP Cache-Control Direktiflerini Do\u011fru Okumak<\/a><ul><li><a href=\"#Temel_Cache-Control_direktifleri\"><span class=\"toc_number toc_depth_2\">1.1<\/span> Temel Cache-Control direktifleri<\/a><\/li><li><a href=\"#Gelismis_direktifler_stale-while-revalidate_ve_stale-if-error\"><span class=\"toc_number toc_depth_2\">1.2<\/span> Geli\u015fmi\u015f direktifler: stale-while-revalidate ve stale-if-error<\/a><\/li><\/ul><\/li><li><a href=\"#ETag_ve_Last-Modified_ile_Kosullu_Istekler\"><span class=\"toc_number toc_depth_1\">2<\/span> ETag ve Last-Modified ile Ko\u015fullu \u0130stekler<\/a><ul><li><a href=\"#ETag_nedir_nasil_calisir\"><span class=\"toc_number toc_depth_2\">2.1<\/span> ETag nedir, nas\u0131l \u00e7al\u0131\u015f\u0131r<\/a><\/li><li><a href=\"#Last-Modified_ile_birlikte_kullanim_ve_CDN_etkisi\"><span class=\"toc_number toc_depth_2\">2.2<\/span> Last-Modified ile birlikte kullan\u0131m ve CDN etkisi<\/a><\/li><\/ul><\/li><li><a href=\"#WordPress_Icin_Dogru_Tarayici_Onbellekleme_Stratejisi\"><span class=\"toc_number toc_depth_1\">3<\/span> WordPress \u0130\u00e7in Do\u011fru Taray\u0131c\u0131 \u00d6nbellekleme Stratejisi<\/a><ul><li><a href=\"#Statik_dosyalar_CSS_JS_gorseller_ve_yazi_tipleri\"><span class=\"toc_number toc_depth_2\">3.1<\/span> Statik dosyalar: CSS, JS, g\u00f6rseller ve yaz\u0131 tipleri<\/a><\/li><li><a href=\"#HTML_sayfalar_WooCommerce_sayfalari_ve_kullaniciya_ozel_icerik\"><span class=\"toc_number toc_depth_2\">3.2<\/span> HTML sayfalar, WooCommerce sayfalar\u0131 ve kullan\u0131c\u0131ya \u00f6zel i\u00e7erik<\/a><\/li><li><a href=\"#Nginx_ve_Apache_icin_ornek_WordPress_ayarlari\"><span class=\"toc_number toc_depth_2\">3.3<\/span> Nginx ve Apache i\u00e7in \u00f6rnek WordPress ayarlar\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#Laravel_Uygulamalarinda_Cache-Control_ve_ETag\"><span class=\"toc_number toc_depth_1\">4<\/span> Laravel Uygulamalar\u0131nda Cache-Control ve ETag<\/a><ul><li><a href=\"#Asset_versiyonlama_mix_ve_vite_kullanimi\"><span class=\"toc_number toc_depth_2\">4.1<\/span> Asset versiyonlama: mix ve vite kullan\u0131m\u0131<\/a><\/li><li><a href=\"#API_cevaplari_icin_Cache-Control_ve_ETag_stratejisi\"><span class=\"toc_number toc_depth_2\">4.2<\/span> API cevaplar\u0131 i\u00e7in Cache-Control ve ETag stratejisi<\/a><\/li><\/ul><\/li><li><a href=\"#SPA_Projeleri_React_Vue_Angular_Icin_Onbellek_Kurallari\"><span class=\"toc_number toc_depth_1\">5<\/span> SPA Projeleri (React, Vue, Angular) \u0130\u00e7in \u00d6nbellek Kurallar\u0131<\/a><ul><li><a href=\"#indexhtml_icin_kisa_sureli_fakat_kontrollu_cache\"><span class=\"toc_number toc_depth_2\">5.1<\/span> index.html i\u00e7in k\u0131sa s\u00fcreli fakat kontroll\u00fc cache<\/a><\/li><li><a href=\"#Hashli_JS_ve_CSS_dosyalari_icin_agresif_cache\"><span class=\"toc_number toc_depth_2\">5.2<\/span> Hashli JS ve CSS dosyalar\u0131 i\u00e7in agresif cache<\/a><\/li><li><a href=\"#Service_Worker_offline_cache_ve_CDN_uyumu\"><span class=\"toc_number toc_depth_2\">5.3<\/span> Service Worker, offline cache ve CDN uyumu<\/a><\/li><\/ul><\/li><li><a href=\"#CDN_ile_Origin_Onbellegini_Uyumlu_Hale_Getirmek\"><span class=\"toc_number toc_depth_1\">6<\/span> CDN ile Origin \u00d6nbelle\u011fini Uyumlu Hale Getirmek<\/a><ul><li><a href=\"#Cache_key_cookie_ve_Vary_basliklari\"><span class=\"toc_number toc_depth_2\">6.1<\/span> Cache key, cookie ve Vary ba\u015fl\u0131klar\u0131<\/a><\/li><li><a href=\"#Origin_ve_CDN_arasinda_rol_dagilimi\"><span class=\"toc_number toc_depth_2\">6.2<\/span> Origin ve CDN aras\u0131nda rol da\u011f\u0131l\u0131m\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#Tipik_DCHost_Senaryolari_WordPress_Laravel_API_ve_SPA\"><span class=\"toc_number toc_depth_1\">7<\/span> Tipik DCHost Senaryolar\u0131: WordPress, Laravel API ve SPA<\/a><ul><li><a href=\"#1_Klasik_blog_veya_kurumsal_WordPress_sitesi\"><span class=\"toc_number toc_depth_2\">7.1<\/span> 1. Klasik blog veya kurumsal WordPress sitesi<\/a><\/li><li><a href=\"#2_Laravel_tabanli_API_admin_panel\"><span class=\"toc_number toc_depth_2\">7.2<\/span> 2. Laravel tabanl\u0131 API + admin panel<\/a><\/li><li><a href=\"#3_SPA_frontend_ayri_API_sunucusu\"><span class=\"toc_number toc_depth_2\">7.3<\/span> 3. SPA frontend + ayr\u0131 API sunucusu<\/a><\/li><\/ul><\/li><li><a href=\"#Sonuc_HTTP_Onbellegi_Dogru_Kuruldugunda_Ne_Kazanirsiniz\"><span class=\"toc_number toc_depth_1\">8<\/span> Sonu\u00e7: HTTP \u00d6nbelle\u011fi Do\u011fru Kuruldu\u011funda Ne Kazan\u0131rs\u0131n\u0131z<\/a><\/li><\/ul><\/div>\n<h2><span id=\"HTTP_Cache-Control_Direktiflerini_Dogru_Okumak\">HTTP Cache-Control Direktiflerini Do\u011fru Okumak<\/span><\/h2>\n<p>n<\/p>\n<p>Cache-Control ba\u015fl\u0131\u011f\u0131, taray\u0131c\u0131n\u0131n ve ara \u00f6nbelleklerin (CDN, reverse proxy vb.) i\u00e7eri\u011fi nas\u0131l saklayaca\u011f\u0131n\u0131 belirleyen anahtar mekanizma. Temel ve geli\u015fmi\u015f direktifleri netle\u015ftirelim.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Temel_Cache-Control_direktifleri\">Temel Cache-Control direktifleri<\/span><\/h3>\n<p>n<\/p>\n<ul>n<\/p>\n<li><strong>max-age=sek<\/strong>: \u0130\u00e7eri\u011fin ka\u00e7 saniye boyunca taze kabul edilece\u011fini belirtir. \u00d6rne\u011fin 86400 bir g\u00fcn demektir.<\/li>\n<p>n<\/p>\n<li><strong>s-maxage=sek<\/strong>: Payla\u015f\u0131ml\u0131 cacheler (CDN, proxy) i\u00e7in max-age de\u011ferini override eder. Taray\u0131c\u0131 farkl\u0131, CDN farkl\u0131 s\u00fcre kullanabilir.<\/li>\n<p>n<\/p>\n<li><strong>public<\/strong>: Cevab\u0131n, payla\u015f\u0131ml\u0131 cacheler taraf\u0131ndan saklanabilece\u011fini s\u00f6yler. HTML sayfalar\u0131 i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/li>\n<p>n<\/p>\n<li><strong>private<\/strong>: Cevab\u0131n sadece taray\u0131c\u0131 taraf\u0131nda cachelenmesi gerekti\u011fini, payla\u015f\u0131ml\u0131 cacheler i\u00e7in uygun olmad\u0131\u011f\u0131n\u0131 belirtir. Kullan\u0131c\u0131ya \u00f6zel dashboard ve hesap sayfalar\u0131 i\u00e7in idealdir.<\/li>\n<p>n<\/p>\n<li><strong>no-store<\/strong>: \u0130\u00e7erik hi\u00e7 bir \u015fekilde cachelenmesin, disk veya haf\u0131zaya yaz\u0131lmas\u0131n demektir. \u00d6deme sayfalar\u0131 ve y\u00fcksek hassasiyetli veriler i\u00e7in kullanmal\u0131s\u0131n\u0131z.<\/li>\n<p>n<\/p>\n<li><strong>no-cache<\/strong>: \u0130sim kafa kar\u0131\u015ft\u0131r\u0131c\u0131; asl\u0131nda cachelemeyi tamamen kapatmak de\u011fildir. \u0130\u00e7eri\u011fin cachelenebilece\u011fini ancak her kullan\u0131mda origin ile yeniden do\u011frulanmas\u0131 gerekti\u011fini s\u00f6yler (ETag veya Last-Modified ile).<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Pratikte statik dosyalar i\u00e7in public, max-age y\u00fcksek; dinamik HTML ve API cevaplar\u0131 i\u00e7in ise private veya no-store + k\u0131sa s\u00fcreli max-age kombinasyonlar\u0131 kullan\u0131l\u0131r. \u00d6rne\u011fin WordPress ana sayfan\u0131z i\u00e7in 60 saniyelik bir mikro cache makul olabilirken, logo PNG i\u00e7in 30 g\u00fcn cache s\u00fcresi son derece g\u00fcvenlidir.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Gelismis_direktifler_stale-while-revalidate_ve_stale-if-error\">Geli\u015fmi\u015f direktifler: stale-while-revalidate ve stale-if-error<\/span><\/h3>\n<p>n<\/p>\n<p>Modern taray\u0131c\u0131lar ve CDNler, iki \u00f6nemli direktifi daha destekliyor:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li><strong>stale-while-revalidate=sek<\/strong>: \u0130\u00e7erik asl\u0131nda s\u00fcresi dolmu\u015f olsa bile, belirtilen s\u00fcre boyunca eski versiyonun kullan\u0131c\u0131ya g\u00f6sterilmesine izin verirken arka planda taze versiyonu \u00e7ekip cachei g\u00fcnceller.<\/li>\n<p>n<\/p>\n<li><strong>stale-if-error=sek<\/strong>: Origin eri\u015filemez veya hata veriyorsa, belirtilen s\u00fcre boyunca eski cache i\u00e7eri\u011finin kullan\u0131lmas\u0131na izin verir. Kesintilerde hayat kurtar\u0131c\u0131d\u0131r.<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Bu mekanizmalar, \u00f6zellikle CDN seviyesinde kullan\u0131ld\u0131\u011f\u0131nda kesintisiz yay\u0131na ciddi katk\u0131 sa\u011flar. Bu konuyu daha \u00f6nce <a href='https:\/\/www.dchost.com\/blog\/kesinti-caninizi-sikmasin-stale-while-revalidate-ve-stale-if-error-nasil-hayat-kurtarir\/'>stale-while-revalidate ve stale-if-error direktiflerinin pratik kullan\u0131m\u0131<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131m\u0131zda detayl\u0131 anlatm\u0131\u015ft\u0131k. Buradaki fikir \u015fu: Origininiz k\u0131sa s\u00fcreli bir problem ya\u015fasa bile, kullan\u0131c\u0131 taraf\u0131nda \u00e7o\u011fu zaman kimse fark etmez.<\/p>\n<p>nn<\/p>\n<h2><span id=\"ETag_ve_Last-Modified_ile_Kosullu_Istekler\">ETag ve Last-Modified ile Ko\u015fullu \u0130stekler<\/span><\/h2>\n<p>n<\/p>\n<p>Cache-Control ile ne kadar s\u00fcre cachelenece\u011fini belirledik. Peki i\u00e7erik de\u011fi\u015fti\u011finde taray\u0131c\u0131 bunu nas\u0131l anlayacak? Tam burada ETag ve Last-Modified devreye giriyor.<\/p>\n<p>nn<\/p>\n<h3><span id=\"ETag_nedir_nasil_calisir\">ETag nedir, nas\u0131l \u00e7al\u0131\u015f\u0131r<\/span><\/h3>\n<p>n<\/p>\n<p>ETag, sunucunun her cevap i\u00e7in \u00fcretti\u011fi benzersiz bir i\u00e7erik etiketi. Genelde dosyan\u0131n hash de\u011feri, inode bilgisi veya benzeri bir \u00f6zet \u00fczerinden olu\u015fturulur. \u0130stemci, ilk istekte ETag de\u011ferini response header olarak al\u0131r ve sonraki iste\u011finde If-None-Match ba\u015fl\u0131\u011f\u0131 ile geri g\u00f6nderir. E\u011fer sunucudaki i\u00e7erik de\u011fi\u015fmediyse 304 Not Modified cevab\u0131 d\u00f6ner ve veri tekrar indirilmez; sadece headerlar g\u00fcncellenir.<\/p>\n<p>n<\/p>\n<p>Bu mekanizma \u00f6zellikle \u015fu durumlarda \u00e7ok de\u011ferlidir:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>max-age s\u00fcresi nispeten k\u0131sa tutulmak zorundaysa bile gereksiz veri transferini azaltmak<\/li>\n<p>n<\/p>\n<li>API cevaplar\u0131 i\u00e7in, veri de\u011fi\u015fmedi\u011fi s\u00fcrece network ve CPU maliyetini k\u0131smak<\/li>\n<p>n<\/p>\n<li>Dinamik HTML sayfalarda, de\u011fi\u015fiklik olmayan kullan\u0131c\u0131lar i\u00e7in daha h\u0131zl\u0131 yan\u0131t sa\u011flamak<\/li>\n<p>n<\/ul>\n<p>nn<\/p>\n<h3><span id=\"Last-Modified_ile_birlikte_kullanim_ve_CDN_etkisi\">Last-Modified ile birlikte kullan\u0131m ve CDN etkisi<\/span><\/h3>\n<p>n<\/p>\n<p>Last-Modified ba\u015fl\u0131\u011f\u0131, i\u00e7eri\u011fin son de\u011fi\u015ftirilme zaman\u0131n\u0131 belirtir. Taray\u0131c\u0131 bir sonraki istekte If-Modified-Since ile gelir ve i\u00e7erik de\u011fi\u015fmemi\u015fse yine 304 d\u00f6nd\u00fcr\u00fcl\u00fcr. ETag ve Last-Modified genelde birlikte kullan\u0131l\u0131r; baz\u0131 durumlarda sadece Last-Modified yeterli olabilir.<\/p>\n<p>n<\/p>\n<p>CDN taraf\u0131nda ise dikkat edilmesi gereken nokta \u015fudur: Baz\u0131 CDNler, ETag ba\u015fl\u0131klar\u0131n\u0131 manip\u00fcle edebilir veya origin ile edge aras\u0131nda farkl\u0131la\u015ft\u0131rabilir. Ayr\u0131ca ETag de\u011feriniz sunucudaki dosyan\u0131n inode bilgisinden t\u00fcretiliyorsa, \u00e7oklu sunucu mimarilerinde (\u00f6rne\u011fin DCHost \u00fczerinde birden fazla web sunucusuna da\u011f\u0131t\u0131lm\u0131\u015f WordPress cluster\u0131) ayn\u0131 i\u00e7eri\u011fe farkl\u0131 ETagler \u00fcretilebilir. Bu da cache isabet oran\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr. Bu y\u00fczden, m\u00fcmk\u00fcn oldu\u011funca i\u00e7erik tabanl\u0131 hash veya build s\u00fcrecinde \u00fcretilen sabit ETag mekanizmalar\u0131n\u0131 tercih etmek daha sa\u011fl\u0131kl\u0131 olur.<\/p>\n<p>nn<\/p>\n<h2><span id=\"WordPress_Icin_Dogru_Tarayici_Onbellekleme_Stratejisi\">WordPress \u0130\u00e7in Do\u011fru Taray\u0131c\u0131 \u00d6nbellekleme Stratejisi<\/span><\/h2>\n<p>n<\/p>\n<p>WordPress ekosisteminde en s\u0131k g\u00f6rd\u00fc\u011f\u00fcm\u00fcz senaryo \u015fu: Statik dosyalar agresif \u015fekilde cachelenmemi\u015f, HTML sayfalar ise ya tamamen dinamik ya da CDN d\u00fczeyinde yanl\u0131\u015fl\u0131kla public cachelenmi\u015f. Do\u011fru ayr\u0131m\u0131 yapmak i\u00e7in WordPressi ikiye b\u00f6lmek gerekir: Statik varl\u0131klar ve HTML \u00e7\u0131kt\u0131lar.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Statik_dosyalar_CSS_JS_gorseller_ve_yazi_tipleri\">Statik dosyalar: CSS, JS, g\u00f6rseller ve yaz\u0131 tipleri<\/span><\/h3>\n<p>n<\/p>\n<p>WordPress tema ve eklentileriniz \u00e7o\u011funlukla versiyon parametreleri ile cache busting uygular. \u00d6rne\u011fin style.css dosyan\u0131z \u015fu \u015fekilde \u00e7a\u011fr\u0131l\u0131r:<\/p>\n<p>n<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">\/wp-content\/themes\/tema\/style.css?ver=1.4.3<\/code><\/pre>\n<p>n<\/p>\n<p>Bu sayede dosyaya 1 y\u0131l bile cache s\u00fcresi verseniz, dosya de\u011fi\u015fti\u011finde versiyon numaras\u0131 de\u011fi\u015fece\u011fi i\u00e7in taray\u0131c\u0131 yeni dosyay\u0131 indirir. Bu, uzun s\u00fcreli cache ve g\u00fcvenli g\u00fcncelleme kombinasyonunun alt\u0131n standard\u0131d\u0131r.<\/p>\n<p>n<\/p>\n<p>\u00d6nerilen ayarlar kabaca \u015f\u00f6yle olabilir:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>CSS, JS, font ve g\u00f6rseller i\u00e7in: Cache-Control public, max-age=2592000 (30 g\u00fcn) veya daha uzun<\/li>\n<p>n<\/p>\n<li>immutable direktifini ekleyerek, ayn\u0131 dosya ismi de\u011fi\u015fmedi\u011fi s\u00fcrece taray\u0131c\u0131n\u0131n yeniden do\u011frulama ihtiyac\u0131n\u0131 azaltabilirsiniz<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">location ~* .(css|js|png|jpe?g|gif|svg|webp|ico|woff2?)$ {n    expires 30d;n    add_header Cache-Control 'public, max-age=2592000, immutable';n}<\/code><\/pre>\n<p>n<\/p>\n<p>G\u00f6rsel optimizasyonu ve CDN taraf\u0131ndaki ayarlarla birlikte d\u00fc\u015f\u00fcnmek isterseniz, <a href='https:\/\/www.dchost.com\/blog\/gorsel-seo-ve-hosting-altyapisi-webp-avif-cdn-alt-alan-adlari-ve-gorsel-site-haritasi\/'>WebP, AVIF ve CDN alt alan adlar\u0131 ile g\u00f6rsel SEO stratejileri<\/a> yaz\u0131s\u0131ndaki \u00f6nerilerle bu ayarlar\u0131 birle\u015ftirebilirsiniz.<\/p>\n<p>nn<\/p>\n<h3><span id=\"HTML_sayfalar_WooCommerce_sayfalari_ve_kullaniciya_ozel_icerik\">HTML sayfalar, WooCommerce sayfalar\u0131 ve kullan\u0131c\u0131ya \u00f6zel i\u00e7erik<\/span><\/h3>\n<p>n<\/p>\n<p>HTML taraf\u0131nda ise biraz daha dikkatli olmak \u015fart. Ana sayfa, kategori sayfalar\u0131 ve blog yaz\u0131lar\u0131 i\u00e7in tam sayfa \u00f6nbellekleme (server side cache) kullan\u0131yorsan\u0131z, taray\u0131c\u0131ya uzun s\u00fcreli cache s\u00fcresi vermenize \u00e7o\u011fu zaman gerek kalmaz. Burada ama\u00e7 taray\u0131c\u0131dan \u00e7ok, sunucuyu rahatlatan reverse proxy veya uygulama i\u00e7i cachelerdir. Yine de mikro \u00f6nbellekleme ile 30 ila 120 saniye aras\u0131nda bir max-age, \u00f6zellikle yo\u011fun trafikli haber ve blog sitelerinde olduk\u00e7a i\u015fe yarar.<\/p>\n<p>n<\/p>\n<p>WooCommerce taraf\u0131nda ise sepet, \u00f6deme ve hesap sayfalar\u0131 kesinlikle public cachelenmemelidir. Bu sayfalar i\u00e7in:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Cache-Control no-store, no-cache, must-revalidate<\/li>\n<p>n<\/p>\n<li>Pragma no-cache (eski taray\u0131c\u0131lar i\u00e7in)<\/li>\n<p>n<\/p>\n<li>Vary Cookie veya Authorization gibi ba\u015fl\u0131klarla CDN seviyesinde de cachelenmesi engellenmelidir<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>CDN ve edge kurallar\u0131 ile HTML cachei y\u00f6netmek \u00fczerine daha odakl\u0131 bir rehbere ihtiyac\u0131n\u0131z varsa, <a href='https:\/\/www.dchost.com\/blog\/wordpress-icin-cdn-onbellek-kurallari-nasil-kurulur-woocommercede-html-cache-bypass-ve-edge-ayarlariyla-uctan-uca-hiz\/'>WordPress i\u00e7in CDN \u00f6nbellek kurallar\u0131 ve WooCommercede HTML cache bypass stratejileri<\/a> yaz\u0131m\u0131z\u0131 da bu makale ile birlikte okuman\u0131z\u0131 \u00f6neririm.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Nginx_ve_Apache_icin_ornek_WordPress_ayarlari\">Nginx ve Apache i\u00e7in \u00f6rnek WordPress ayarlar\u0131<\/span><\/h3>\n<p>n<\/p>\n<p>Nginx \u00fczerinde tipik bir WordPress kurulumunda, a\u015fa\u011f\u0131daki gibi bir ayr\u0131m yap\u0131labilir:<\/p>\n<p>n<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\"># Statik dosyalar uzun s\u00fcre cachenlocation ~* .(css|js|png|jpe?g|gif|svg|webp|ico|woff2?)$ {n    expires 30d;n    add_header Cache-Control 'public, max-age=2592000, immutable';n}nn# Dinamik PHP sayfalar i\u00e7in k\u0131sa s\u00fcreli veya hi\u00e7 cache yoknlocation ~ \\.php$ {n    add_header Cache-Control 'private, no-cache, no-store, must-revalidate';n    include fastcgi_params;n    fastcgi_pass php-fpm:9000;n}<\/code><\/pre>\n<p>n<\/p>\n<p>Tabii ki burada php-fpm havuz ayarlar\u0131 ve OPcache yap\u0131land\u0131rmas\u0131n\u0131n da devreye girdi\u011fini unutmayal\u0131m. Sunucu taraf\u0131 WordPress optimizasyonu i\u00e7in, <a href='https:\/\/www.dchost.com\/blog\/wordpress-icin-sunucu-tarafi-optimizasyon-php-fpm-opcache-redis-ve-mysql-ile-neyi-ne-zaman-nasil-ayarlamalisin\/'>PHP-FPM, OPcache ve Redis ile WordPress optimizasyon rehberimizi<\/a> inceleyebilirsiniz. DCHost altyap\u0131s\u0131nda s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z yap\u0131, tam sayfa cache + uzun s\u00fcreli statik asset cache kombinasyonudur.<\/p>\n<p>nn<\/p>\n<h2><span id=\"Laravel_Uygulamalarinda_Cache-Control_ve_ETag\">Laravel Uygulamalar\u0131nda Cache-Control ve ETag<\/span><\/h2>\n<p>n<\/p>\n<p>Laravel taraf\u0131nda hem klasik web uygulamalar\u0131 hem de sadece API sa\u011flayan servisler s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131k\u0131yor. \u00c7o\u011fu projede \u00f6nbellekleme sadece uygulama i\u00e7i cache mekanizmalar\u0131 ile s\u0131n\u0131rl\u0131 kal\u0131yor; HTTP seviyesinde ise neredeyse hi\u00e7 ayar yap\u0131lm\u0131yor. Oysa Laravel, bu konuda gayet esnek bir temel sunuyor.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Asset_versiyonlama_mix_ve_vite_kullanimi\">Asset versiyonlama: mix ve vite kullan\u0131m\u0131<\/span><\/h3>\n<p>n<\/p>\n<p>\u00d6nce, statik dosyalardan ba\u015flayal\u0131m. Laravel Mix veya Vite kulland\u0131\u011f\u0131n\u0131zda, derlenen CSS ve JS dosyalar\u0131 genelde \u015fu formatta \u00fcretilir:<\/p>\n<p>n<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">\/build\/assets\/app.7c3f9a2d.jsn\/build\/assets\/app.19b5c811.css<\/code><\/pre>\n<p>n<\/p>\n<p>Bu hashli dosya isimleri, agresif taray\u0131c\u0131 ve CDN cachei i\u00e7in bi\u00e7ilmi\u015f kaftand\u0131r. \u00c7\u00fcnk\u00fc dosya i\u00e7eri\u011fi de\u011fi\u015fti\u011finde isim de de\u011fi\u015fir; eski isimli dosyalar cachete kalsa bile yeni versiyon otomatik olarak \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<p>n<\/p>\n<p>Bu durumda, Nginx veya Apache seviyesinde \u015fu mant\u0131kla hareket edebilirsiniz:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>build, public, storage gibi asset dizinleri i\u00e7in public, max-age=31536000, immutable<\/li>\n<p>n<\/p>\n<li>S\u0131k de\u011fi\u015fmeyen fakat hashlenmemi\u015f dosyalar i\u00e7in max-age daha k\u0131sa<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Bu yap\u0131, \u00f6zellikle DCHost \u00fczerinde y\u00fcksek trafikli Laravel projelerinde CPU y\u00fck\u00fcn\u00fc ciddi \u00f6l\u00e7\u00fcde azalt\u0131yor; \u00e7\u00fcnk\u00fc her sayfa y\u00fcklemesinde tekrar tekrar indirilen a\u011f\u0131r JS bundlelar\u0131 devreden \u00e7\u0131km\u0131\u015f oluyor.<\/p>\n<p>nn<\/p>\n<h3><span id=\"API_cevaplari_icin_Cache-Control_ve_ETag_stratejisi\">API cevaplar\u0131 i\u00e7in Cache-Control ve ETag stratejisi<\/span><\/h3>\n<p>n<\/p>\n<p>Laravel ile yaz\u0131lm\u0131\u015f APIlerde, GET istekleri i\u00e7in ETag ve k\u0131sa s\u00fcreli max-age kombinasyonu \u00e7ok i\u015fe yarar. \u00d6rne\u011fin \u00fcr\u00fcn listesini veya sabit referans verileri d\u00f6nen u\u00e7 noktalar i\u00e7in \u015fu stratejiyi izleyebilirsiniz:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Cache-Control public, max-age=60, stale-while-revalidate=30<\/li>\n<p>n<\/p>\n<li>ETag ba\u015fl\u0131\u011f\u0131 ile i\u00e7erik de\u011fi\u015fmedi\u011finde 304 Not Modified d\u00f6nd\u00fcrmek<\/li>\n<p>n<\/p>\n<li>Yetkilendirme gerektiren u\u00e7 noktalar i\u00e7in ise private ve genelde no-store kullanmak<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Laravelde bir response i\u00e7in ETag eklemek olduk\u00e7a basit:<\/p>\n<p>n<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">return response($content)n    -&gt;header('Cache-Control', 'public, max-age=60, stale-while-revalidate=30')n    -&gt;setEtag(sha1($content));<\/code><\/pre>\n<p>n<\/p>\n<p>Tabii ger\u00e7ek d\u00fcnyada ETagi sadece i\u00e7erikten de\u011fil, versiyon numaran\u0131zdan, g\u00fcncelleme zaman\u0131ndan veya veritaban\u0131 sat\u0131rlar\u0131n\u0131n checksumlar\u0131ndan da t\u00fcretebilirsiniz. \u00d6nemli olan, i\u00e7erik de\u011fi\u015fti\u011finde ETagin de de\u011fi\u015fmesini sa\u011flamak.<\/p>\n<p>n<\/p>\n<p>Laravel prod ortam optimizasyonu ile HTTP cachei birlikte d\u00fc\u015f\u00fcnmek isterseniz, <a href='https:\/\/www.dchost.com\/blog\/laravel-prod-ortam-optimizasyonu-nasil-yapilir-php-fpm-opcache-octane-queue-horizon-ve-redisi-el-ele-calistirmak\/'>Laravel prod ortam optimizasyon rehberi<\/a> bu yaz\u0131n\u0131n iyi bir tamamlay\u0131c\u0131s\u0131 olacakt\u0131r.<\/p>\n<p>nn<\/p>\n<h2><span id=\"SPA_Projeleri_React_Vue_Angular_Icin_Onbellek_Kurallari\">SPA Projeleri (React, Vue, Angular) \u0130\u00e7in \u00d6nbellek Kurallar\u0131<\/span><\/h2>\n<p>n<\/p>\n<p>SPA d\u00fcnyas\u0131nda \u00f6nbellekleme stratejisi WordPress veya klasik Laravel uygulamalar\u0131ndan biraz farkl\u0131. \u00c7\u00fcnk\u00fc \u00e7o\u011fu zaman tek bir index.html dosyas\u0131 ve onun referans verdi\u011fi b\u00fcy\u00fck JS ve CSS bundlelar\u0131 \u00fczerinden \u00e7al\u0131\u015f\u0131yorsunuz. Ayr\u0131ca API istekleri genelde ayr\u0131 bir origin veya alt yol \u00fczerinden servis ediliyor.<\/p>\n<p>nn<\/p>\n<h3><span id=\"indexhtml_icin_kisa_sureli_fakat_kontrollu_cache\">index.html i\u00e7in k\u0131sa s\u00fcreli fakat kontroll\u00fc cache<\/span><\/h3>\n<p>n<\/p>\n<p>SPA projelerinde index.html, uygulaman\u0131z\u0131n giri\u015f noktas\u0131 ve \u00e7o\u011fu zaman \u00e7ok k\u00fc\u00e7\u00fck bir dosya. Bu dosyan\u0131n agresif \u015fekilde cachelenmesi, yeni deploylardan sonra kullan\u0131c\u0131lara eski versiyonun kalmas\u0131n\u0131 sa\u011flar. Bu y\u00fczden genelde \u015fu yakla\u015f\u0131m tercih edilir:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Cache-Control no-cache veya max-age=60 gibi k\u0131sa bir s\u00fcre<\/li>\n<p>n<\/p>\n<li>ETag veya Last-Modified ile ko\u015fullu istek deste\u011fi<\/li>\n<p>n<\/p>\n<li>CDN taraf\u0131nda HTML cachei devre d\u0131\u015f\u0131 b\u0131rakmak veya \u00e7ok k\u0131sa tutmak<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>B\u00f6ylece kullan\u0131c\u0131 sayfan\u0131za her giri\u015f yapt\u0131\u011f\u0131nda en fazla birka\u00e7 saniyelik bir gecikmeyle yeni index.html versiyonunu al\u0131r ve yeni JS bundlelar\u0131na y\u00f6nlendirilir.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Hashli_JS_ve_CSS_dosyalari_icin_agresif_cache\">Hashli JS ve CSS dosyalar\u0131 i\u00e7in agresif cache<\/span><\/h3>\n<p>n<\/p>\n<p>Build s\u00fcrecinde \u00fcretilen app.7c3f9a2d.js veya vendor.19b5c811.css gibi hashli dosyalar i\u00e7in tam tersine, m\u00fcmk\u00fcn olan en agresif cache politikas\u0131n\u0131 uygulamal\u0131s\u0131n\u0131z:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Cache-Control public, max-age=31536000, immutable<\/li>\n<p>n<\/p>\n<li>CDN seviyesinde de ayn\u0131 veya daha uzun s\u00fcre<\/li>\n<p>n<\/p>\n<li>Versiyon de\u011fi\u015fikli\u011fini sadece dosya ismine b\u0131rakarak cache busting sa\u011flamak<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Bu sayede, kullan\u0131c\u0131 siteyi tekrar ziyaret etti\u011finde b\u00fcy\u00fck JS bundlelar\u0131n\u0131 neredeyse hi\u00e7 indirmez; sadece index.html ve gerekirse yeni manifest dosyas\u0131 g\u00fcncellenir. Bu yakla\u015f\u0131m TTFByi de\u011fil ama FCP ve LCPyi ciddi \u015fekilde iyile\u015ftirir.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Service_Worker_offline_cache_ve_CDN_uyumu\">Service Worker, offline cache ve CDN uyumu<\/span><\/h3>\n<p>n<\/p>\n<p>E\u011fer PWA \u00f6zellikleri kullan\u0131yor ve service worker ile offline cache yap\u0131yorsan\u0131z, HTTP seviyesindeki Cache-Control kurallar\u0131n\u0131zla \u00e7ak\u0131\u015fmayacak bir mimari kurman\u0131z gerekir. Genel \u00f6neri \u015fu \u015fekildedir:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Service worker scripti ve manifest dosyas\u0131 i\u00e7in k\u0131sa s\u00fcreli cache ve ETag<\/li>\n<p>n<\/p>\n<li>Service worker\u0131n network-first, cache-first veya stale-while-revalidate stratejilerini bilin\u00e7li se\u00e7mek<\/li>\n<p>n<\/p>\n<li>CDN taraf\u0131nda HTML ve service worker i\u00e7in cache bypass kurallar\u0131 tan\u0131mlamak<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>SPA projelerini ayn\u0131 alan ad\u0131nda API ile birlikte yay\u0131nlama konusu da cache davran\u0131\u015f\u0131n\u0131 etkiler. Bu senaryoyu daha detayl\u0131 anlatt\u0131\u011f\u0131m\u0131z <a href='https:\/\/www.dchost.com\/blog\/react-vue-ve-angular-single-page-applicationlari-ayni-alan-adinda-api-ile-host-etmek-nginx-yonlendirme-ve-ssl-mimarisi\/'>React, Vue ve Angular SPAleri ayn\u0131 alan ad\u0131nda API ile host etme rehberinde<\/a> Nginx y\u00f6nlendirme ve SSL mimarisine ek olarak, cache key ve path bazl\u0131 kurallara da de\u011finmi\u015ftik.<\/p>\n<p>nn<\/p>\n<h2><span id=\"CDN_ile_Origin_Onbellegini_Uyumlu_Hale_Getirmek\">CDN ile Origin \u00d6nbelle\u011fini Uyumlu Hale Getirmek<\/span><\/h2>\n<p>n<\/p>\n<p>Taray\u0131c\u0131 ve CDN \u00f6nbelle\u011fi \u00e7o\u011fu zaman ayn\u0131 Cache-Control ba\u015fl\u0131klar\u0131na baksa da, davran\u0131\u015flar\u0131 ve \u00f6ncelikleri farkl\u0131d\u0131r. Origin sunucunuzda g\u00fczel ayarlar yap\u0131p CDN d\u00fczeyinde bunlar\u0131 yanl\u0131\u015f override ederseniz, \u00e7ok kafa kar\u0131\u015ft\u0131r\u0131c\u0131 sonu\u00e7larla kar\u015f\u0131la\u015fabilirsiniz.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Cache_key_cookie_ve_Vary_basliklari\">Cache key, cookie ve Vary ba\u015fl\u0131klar\u0131<\/span><\/h3>\n<p>n<\/p>\n<p>CDNlerin hangi iste\u011fi hangi cache girdisi ile e\u015fle\u015ftirece\u011fini belirleyen \u015fey cache keydir. Tipik olarak \u015fu par\u00e7alar\u0131 i\u00e7erir:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Host (alan ad\u0131)<\/li>\n<p>n<\/p>\n<li>Path (istek yolu)<\/li>\n<p>n<\/p>\n<li>Sorgu parametreleri (query string) \u2013 hepsi veya se\u00e7ili olanlar<\/li>\n<p>n<\/p>\n<li>Baz\u0131 headerlar (Accept-Encoding, Authorization vb.)<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>WordPress ve WooCommerce sitelerinde en kritik nokta, kullan\u0131c\u0131y\u0131 tan\u0131mlayan cookie de\u011ferlerinin cache keye nas\u0131l dahil edilece\u011fidir. Genellikle login olmu\u015f kullan\u0131c\u0131lar\u0131 ve sepet i\u00e7eren oturumlar\u0131 cache d\u0131\u015f\u0131nda b\u0131rakmak i\u00e7in, belirli cookie adlar\u0131na g\u00f6re bypass kurallar\u0131 yaz\u0131l\u0131r. \u00d6rne\u011fin:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li>wp_logged_in_ ile ba\u015flayan cookie varsa HTML cache bypass<\/li>\n<p>n<\/p>\n<li>woocommerce_cart_hash veya woocommerce_items_in_cart varsa cache bypass<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Benzer \u015fekilde, Laravel tabanl\u0131 bir SaaS uygulamas\u0131nda Authorization header\u0131 i\u00e7eren isteklerin CDN seviyesinde cachelenmemesini istersiniz. Bunu Vary Authorization ba\u015fl\u0131\u011f\u0131 ve CDN taraf\u0131nda ek kurallarla destekleyebilirsiniz.<\/p>\n<p>nn<\/p>\n<h3><span id=\"Origin_ve_CDN_arasinda_rol_dagilimi\">Origin ve CDN aras\u0131nda rol da\u011f\u0131l\u0131m\u0131<\/span><\/h3>\n<p>n<\/p>\n<p>DCHost ortam\u0131nda tipik olarak \u015fu rol da\u011f\u0131l\u0131m\u0131n\u0131 \u00f6neriyoruz:<\/p>\n<p>n<\/p>\n<ul>n<\/p>\n<li><strong>Origin (Nginx, Apache veya uygulama)<\/strong>: Do\u011fru Cache-Control, ETag, Last-Modified ve Vary ba\u015fl\u0131klar\u0131n\u0131 \u00fcretir. Statik dosyalar i\u00e7in uzun s\u00fcreli, HTML ve API i\u00e7in daha kontroll\u00fc s\u00fcreler belirler.<\/li>\n<p>n<\/p>\n<li><strong>CDN<\/strong>: Bu ba\u015fl\u0131klar\u0131 varsay\u0131lan olarak takip eder, ancak kritik pathler i\u00e7in istisnai edge kurallar\u0131 tan\u0131mlar. \u00d6rne\u011fin wp-admin alt\u0131ndaki t\u00fcm yollar\u0131 kesinlikle cachelememek, login ve checkout sayfalar\u0131n\u0131 HTML cache d\u0131\u015f\u0131nda b\u0131rakmak gibi.<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>CDN se\u00e7imi ve maliyet optimizasyonu taraf\u0131nda daha derin bir bak\u0131\u015fa ihtiyac\u0131n\u0131z varsa, <a href='https:\/\/www.dchost.com\/blog\/cdn-trafik-maliyetlerini-kontrol-altina-almak-origin-pull-cache-hit-ratio-ve-bolgesel-fiyatlandirma\/'>CDN trafik maliyetlerini kontrol alt\u0131na alma rehberinde<\/a> origin pull, cache hit oran\u0131 ve b\u00f6lgesel fiyatland\u0131rma konular\u0131n\u0131 detayl\u0131 ele alm\u0131\u015ft\u0131k. Oradaki \u00f6nerileri, bu yaz\u0131daki HTTP \u00f6nbellek stratejisi ile birle\u015ftirdi\u011finizde hem performans hem de fatura taraf\u0131nda dengeli bir yap\u0131 kurabilirsiniz.<\/p>\n<p>nn<\/p>\n<h2><span id=\"Tipik_DCHost_Senaryolari_WordPress_Laravel_API_ve_SPA\">Tipik DCHost Senaryolar\u0131: WordPress, Laravel API ve SPA<\/span><\/h2>\n<p>n<\/p>\n<p>Sahada en s\u0131k g\u00f6rd\u00fc\u011f\u00fcm\u00fcz \u00fc\u00e7 senaryoyu, somut \u00f6nbellek kurallar\u0131 ile \u00f6zetleyelim.<\/p>\n<p>nn<\/p>\n<h3><span id=\"1_Klasik_blog_veya_kurumsal_WordPress_sitesi\">1. Klasik blog veya kurumsal WordPress sitesi<\/span><\/h3>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Statik varl\u0131klar (wp-content, wp-includes alt\u0131ndaki css, js, img, fonts): public, max-age=2592000 veya 31536000, immutable<\/li>\n<p>n<\/p>\n<li>HTML sayfalar (ana sayfa, yaz\u0131, kategori): sunucu taraf\u0131nda tam sayfa cache 60\u2013300 saniye, taray\u0131c\u0131 taraf\u0131nda k\u0131sa max-age (60\u2013120 saniye) veya no-cache<\/li>\n<p>n<\/p>\n<li>Y\u00f6netim paneli, wp-admin ve wp-login.php: no-store, no-cache, Pragma no-cache ve CDN seviyesinde cache bypass<\/li>\n<p>n<\/ul>\n<p>nn<\/p>\n<h3><span id=\"2_Laravel_tabanli_API_admin_panel\">2. Laravel tabanl\u0131 API + admin panel<\/span><\/h3>\n<p>n<\/p>\n<ul>n<\/p>\n<li>Statik assetler (build klas\u00f6r\u00fc): public, max-age=31536000, immutable<\/li>\n<p>n<\/p>\n<li>Genel GET u\u00e7 noktalar\u0131 (\u00fcr\u00fcn listeleri, sabit i\u00e7erikler): public, max-age=60\u2013300, ETag ile 304 deste\u011fi<\/li>\n<p>n<\/p>\n<li>Auth gerektiren GET u\u00e7 noktalar\u0131: private, no-store, k\u0131sa max-age veya tamamen kapal\u0131 cache<\/li>\n<p>n<\/p>\n<li>Admin panel HTML ve JS: private, no-store; CDNde host ediliyorsa path bazl\u0131 cache bypass<\/li>\n<p>n<\/ul>\n<p>nn<\/p>\n<h3><span id=\"3_SPA_frontend_ayri_API_sunucusu\">3. SPA frontend + ayr\u0131 API sunucusu<\/span><\/h3>\n<p>n<\/p>\n<ul>n<\/p>\n<li>index.html: no-cache veya max-age=60, ETag deste\u011fi<\/li>\n<p>n<\/p>\n<li>Hashli JS, CSS, font ve imajlar: public, max-age=31536000, immutable<\/li>\n<p>n<\/p>\n<li>API GET u\u00e7 noktalar\u0131: durumuna g\u00f6re k\u0131sa s\u00fcreli public cache veya private + ETag<\/li>\n<p>n<\/p>\n<li>Login ve kullan\u0131c\u0131ya \u00f6zel veri d\u00f6nen u\u00e7 noktalar: no-store, Vary Authorization ve CDN cache bypass<\/li>\n<p>n<\/ul>\n<p>n<\/p>\n<p>Bu senaryolar\u0131n tamam\u0131nda ortak nokta \u015fu: \u00d6nbellekleme stratejisi sadece bir header eklemekten ibaret de\u011fil. Uygulama katman\u0131, web sunucusu, CDN ve taray\u0131c\u0131 birlikte d\u00fc\u015f\u00fcn\u00fcl\u00fcyor. DCHost ekibi olarak yeni bir proje g\u00f6\u00e7\u00fc veya kapasite planlamas\u0131 yaparken, bu d\u00f6rtl\u00fcy\u00fc her zaman beraber masaya yat\u0131r\u0131yoruz.<\/p>\n<p>nn<\/p>\n<h2><span id=\"Sonuc_HTTP_Onbellegi_Dogru_Kuruldugunda_Ne_Kazanirsiniz\">Sonu\u00e7: HTTP \u00d6nbelle\u011fi Do\u011fru Kuruldu\u011funda Ne Kazan\u0131rs\u0131n\u0131z<\/span><\/h2>\n<p>n<\/p>\n<p>HTTP Cache-Control ba\u015fl\u0131klar\u0131, ETag ve CDN \u00f6nbellek kurallar\u0131 do\u011fru kurguland\u0131\u011f\u0131nda ortaya \u00fc\u00e7 somut kazan\u0131m \u00e7\u0131kar: Son kullan\u0131c\u0131 i\u00e7in belirgin h\u0131z art\u0131\u015f\u0131, sunucu kaynak kullan\u0131m\u0131nda ciddi azalma ve altyap\u0131 maliyetinde g\u00f6zle g\u00f6r\u00fcl\u00fcr d\u00fc\u015f\u00fc\u015f. WordPress taraf\u0131nda statik varl\u0131klar\u0131 uzun s\u00fcreli cacheleyip HTML i\u00e7in ak\u0131ll\u0131 bir tam sayfa cache kurdu\u011funuzda, ayn\u0131 donan\u0131m \u00fczerinde \u00e7ok daha fazla trafi\u011fi rahatl\u0131kla kald\u0131rabilirsiniz. Laravel ve SPA projelerinde ise hashli assetler i\u00e7in agresif cache, index.html ve API cevaplar\u0131 i\u00e7in dengeli bir stratejiyle birle\u015fti\u011finde, hem yeni deploylarda hem de pik trafikte sistemi ayakta tutmak \u00e7ok daha kolay hale gelir.<\/p>\n<p>n<\/p>\n<p>Buradan sonra atabilece\u011finiz en mant\u0131kl\u0131 ad\u0131m, mevcut sitenizin HTTP ba\u015fl\u0131klar\u0131n\u0131 ve CDN kurallar\u0131n\u0131 g\u00f6zden ge\u00e7irmek. Taray\u0131c\u0131 taraf\u0131nda hangi dosya ne kadar s\u00fcre cacheleniyor, CDN katman\u0131nda hangi pathler HTML cacheleniyor, login veya \u00f6deme sayfalar\u0131 g\u00fcvenli mi; hepsini tek tek kontrol edin. \u0130sterseniz, DCHost \u00fczerindeki WordPress, Laravel veya SPA projelerinizi incelerken sizin i\u00e7in \u00f6zelle\u015ftirilmi\u015f bir \u00f6nbellek stratejisi de \u00e7\u0131karabiliriz. Altyap\u0131 taraf\u0131nda NVMe diskli <a href=\"https:\/\/www.dchost.com\/tr\/vps\">VPS<\/a>, <a href=\"https:\/\/www.dchost.com\/tr\/fiziksel-sunucu\">dedicated sunucu<\/a> veya colocation se\u00e7enekleriyle, do\u011fru HTTP \u00f6nbellekleme ayarlar\u0131n\u0131 destekleyen g\u00fc\u00e7l\u00fc bir temel kurmak m\u00fcmk\u00fcn. K\u0131sacas\u0131; \u00f6nce HTTP ba\u015fl\u0131klar\u0131n\u0131 temizleyin, ard\u0131ndan ihtiyac\u0131n\u0131za uygun DCHost altyap\u0131s\u0131 ile bu stratejiyi g\u00fcvenle b\u00fcy\u00fct\u00fcn.<\/p>\n<p>n&#8221;,<br \/>\n  &#8220;focus_keyword&#8221;: &#8220;HTTP Cache-Control ve ETag&#8221;,<br \/>\n  &#8220;meta_description&#8221;: &#8220;HTTP Cache-Control, ETag ve CDN \u00f6nbellek kurallar\u0131 ile WordPress, Laravel ve SPA projelerinde taray\u0131c\u0131 cacheini do\u011fru kurarak h\u0131z\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131n.&#8221;,<br \/>\n  &#8220;faqs&#8221;: [<br \/>\n    {<br \/>\n      &#8220;question&#8221;: &#8220;HTTP Cache-Control ile ETag aras\u0131ndaki fark nedir, hangisini ne zaman kullanmal\u0131y\u0131m?&#8221;,<br \/>\n      &#8220;answer&#8221;: &#8220;Cache-Control, i\u00e7eri\u011fin ne kadar s\u00fcre ve kimler taraf\u0131ndan (taray\u0131c\u0131 m\u0131, CDN mi) cachelenebilece\u011fini s\u00f6yleyen politika ba\u015fl\u0131\u011f\u0131d\u0131r. Yani tazelik s\u00fcresi ve cachelenebilirlik kurallar\u0131n\u0131 belirler. ETag ise i\u00e7eri\u011fin benzersiz bir kimli\u011fi gibi \u00e7al\u0131\u015f\u0131r; taray\u0131c\u0131 bir sonraki istekte If-None-Match ile bu de\u011feri g\u00f6nderir ve i\u00e7erik de\u011fi\u015fmediyse sunucu 304 Not Modified d\u00f6nd\u00fcr\u00fcr. Pratikte statik dosyalar i\u00e7in uzun max-age ve \u00e7o\u011fu zaman ETage ihtiya\u00e7 duymadan, hashli dosya isimleriyle cache busting kullanmak en sa\u011fl\u0131kl\u0131 yakla\u015f\u0131md\u0131r. Dinamik HTML ve API cevaplar\u0131nda ise daha k\u0131sa max-age de\u011ferleri ile birlikte ETag veya Last-Modified kullanmak, gereksiz veri transferini azalt\u0131rken g\u00fcncel i\u00e7eri\u011fi de garanti alt\u0131na al\u0131r.&#8221;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8220;question&#8221;: &#8220;WordPress sitemde hangi dosyalar\u0131 ne kadar s\u00fcre cachelemeliyim?&#8221;,<br \/>\n      &#8220;answer&#8221;: &#8220;WordPress i\u00e7in genel yakla\u015f\u0131m \u015fu olabilir: Tema ve eklenti dosyalar\u0131n\u0131z\u0131n \u00fcretti\u011fi CSS ve JS dosyalar\u0131, ayr\u0131ca g\u00f6rseller ve fontlar genellikle versiyon parametresi veya hashli isimlerle servis edilir. Bu dosyalar i\u00e7in Cache-Control public, max-age=2592000 veya 31536000 gibi uzun s\u00fcreler ve immutable direktifi olduk\u00e7a g\u00fcvenlidir. \u00c7\u00fcnk\u00fc dosya i\u00e7eri\u011fi de\u011fi\u015fti\u011finde isim veya versiyon parametresi de de\u011fi\u015fir, taray\u0131c\u0131 yeni dosyay\u0131 indirir. HTML sayfalar i\u00e7inse tam sayfa cache kullan\u0131yorsan\u0131z sunucu taraf\u0131nda 60\u2013300 saniyelik mikro cache, taray\u0131c\u0131 taraf\u0131nda ise k\u0131sa max-age veya no-cache tercih edebilirsiniz. WooCommerce sepet, \u00f6deme ve hesap sayfalar\u0131 i\u00e7in mutlaka no-store ve cache bypass kurallar\u0131 kullanmak gerekir.&#8221;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8220;question&#8221;: &#8220;SPA (React, Vue, Angular) projelerinde index.html ve JS bundlelar\u0131 i\u00e7in nas\u0131l bir \u00f6nbellek stratejisi izlemeliyim?&#8221;,<br \/>\n      &#8220;answer&#8221;: &#8220;SPA projelerinde index.html ve JS bundlelar\u0131 farkl\u0131 davran\u0131r. index.html k\u00fc\u00e7\u00fckt\u00fcr ancak yeni deploylarda en g\u00fcncel versiyonun h\u0131zla yay\u0131lmas\u0131 \u00e7ok \u00f6nemlidir. Bu y\u00fczden index.html i\u00e7in genellikle Cache-Control no-cache veya k\u0131sa bir max-age (\u00f6rne\u011fin 60 saniye) ve ETag veya Last-Modified ile ko\u015fullu istek deste\u011fi \u00f6nerilir. JS ve CSS bundlelar\u0131 ise hashli dosya isimleriyle \u00fcretilir; bu dosyalar i\u00e7in Cache-Control public, max-age=31536000, immutable gibi agresif bir politika kullanmak en do\u011frusudur. B\u00f6ylece kullan\u0131c\u0131 siteye tekrar girdi\u011finde b\u00fcy\u00fck bundlelar\u0131 yeniden indirmek zorunda kalmaz, sadece index.html \u00fczerinden yeni versiyon kontrol\u00fc yap\u0131l\u0131r. CDN kullan\u0131yorsan\u0131z, HTML ve service worker dosyalar\u0131 i\u00e7in ayr\u0131ca cache bypass veya k\u0131sa TTL kurallar\u0131 tan\u0131mlamay\u0131 da unutmay\u0131n.&#8221;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8220;question&#8221;: &#8220;CDN kullan\u0131rken Cache-Control ba\u015fl\u0131klar\u0131n\u0131 m\u0131 yoksa CDN panelindeki kurallar\u0131 m\u0131 esas almal\u0131y\u0131m?&#8221;,<br \/>\n      &#8220;answer&#8221;: &#8220;\u0130deal senaryoda origin sunucunuzda \u00fcretti\u011finiz Cache-Control, ETag, Last-Modified ve Vary ba\u015fl\u0131klar\u0131 ana kaynakt\u0131r, CDN ise bunlar\u0131 varsay\u0131lan olarak takip eder. Ancak pratikte, kritik pathler i\u00e7in CDN panelinde istisnai kurallar tan\u0131mlamak gerekir. \u00d6rne\u011fin wp-admin ve wp-login.php gibi yollar\u0131 tamamen cache d\u0131\u015f\u0131 b\u0131rakmak, WooCommerce sepet ve \u00f6deme sayfalar\u0131n\u0131 HTML cacheinden muaf tutmak i\u00e7in CDN kurallar\u0131 \u015fartt\u0131r. Statik dosyalar i\u00e7in ise genellikle origin ba\u015fl\u0131klar\u0131na g\u00fcvenip CDN d\u00fczeyinde sadece baz\u0131 override ve minimum TTL kurallar\u0131 koymak yeterlidir. K\u0131sa \u00f6zetle: Politikan\u0131n iskeletini origin \u00fczerinde kurun, CDN kurallar\u0131n\u0131 ise \u00f6zel durumlar ve g\u00fcvenlik i\u00e7in tamamlay\u0131c\u0131 olarak d\u00fc\u015f\u00fcn\u00fcn.&#8221;<br \/>\n    }<br \/>\n  ]<br \/>\n}<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>{ &#8220;title&#8221;: &#8220;HTTP Cache-Control, ETag ve CDN \u00d6nbellek Kurallar\u0131: WordPress, Laravel ve SPA Projeleri \u0130\u00e7in Uygulamal\u0131 Rehber&#8221;, &#8220;content&#8221;: &#8220; Bir WordPress sitesi, bir Laravel API projesi veya modern bir React SPA uygulamas\u0131 geli\u015ftirirken performans konu\u015fulan her toplant\u0131da \u015fu soru mutlaka gelir: Taray\u0131c\u0131 ve CDN \u00f6nbelle\u011fini do\u011fru ayarlasak bu site ne kadar h\u0131zlan\u0131r ve altyap\u0131 maliyeti [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3575,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-3574","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/3574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=3574"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/3574\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/3575"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=3574"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=3574"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=3574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}