JJourney AI

Önbellek ve önizleme

Site şablonunun ISR ve önbellek katmanları, panelin tetiklediği yenileme, önizleme sitesi, yönlendirmeler, dil önekleri ve sitemap.

Son güncelleme: 27 Ekim 20264 dk okuma

Bu sayfada sitenin içeriği nasıl önbelleğe aldığını, panelde yapılan bir değişikliğin siteye nasıl ulaştığını ve önizleme sitesinin canlı siteden farkını öğreneceksin.

İki önbellek katmanı

Site şablonunda iki ayrı önbellek vardır. İkisi de temizlenmezse eski içerik görünmeye devam eder.

KatmanNe tutarSüre
Fetch önbelleğiCMS yanıtları. Hepsi cms-api etiketiyle yazılır.300 saniye
ISR önbelleğiSayfalardan üretilen HTML.300 saniye (revalidate = 300)
src/lib/api/cms.ts
export const CMS_CACHE_TAG = "cms-api";
export const CMS_REVALIDATE_SECONDS = 300;

Kimse yenileme tetiklemese bile bir sayfa en geç beş dakika içinde kendini tazeler. sitemap.xml, robots.txt ve yönlendirme haritası da aynı süreyle önbellekte durur.

Yenileme

/api/revalidate rotası iki katmanı birlikte temizler: cms-api etiketini bayatlatır, ardından sayfaları geçersiz kılar. ?path=/blog/yazi verilirse yalnızca o yol, verilmezse tüm sayfalar geçersiz kılınır.

src/app/api/revalidate/route.ts
revalidateTag(CMS_CACHE_TAG, "max");

const path = new URL(request.url).searchParams.get("path");
if (path) revalidatePath(path);
else revalidatePath("/", "layout");

Panel; sayfa kaydı, onaya gönderme, onay, ret, silme ve sıralama işlemlerinden sonra hem önizleme sitesinin hem canlı sitenin /api/revalidate adresini çağırır. Bu çağrı her zaman tüm siteyi yeniler. Paneldeki Cache Yenile düğmesi aynı yenilemeyi elle tetikler; düğme kullanıldıktan sonra 60 saniye bekletilir. Panel sayfası farklı bir alan adında olduğu için çağrıyı yapabilecek kökenler REVALIDATE_ALLOWED_ORIGINS ile tanımlanır.

Site birden çok sunucu örneğinde çalışıyorsa her örneğin ISR önbelleği kendi diskindedir. Bu durumda diğer örnekleri REVALIDATE_NODES listesine yaz. Yenileme isteği bu örneklere de iletilir.

Zamanlanmış yayın

Zamanlanmış yayın ve yayından kaldırma CMS'te bir arka plan görevinde çalışır ve siteyi çağırmaz. Bu değişiklikler sitede ISR süresi dolunca görünür. API'nin GET /api/v1/page/public-revision ucu yayındaki içeriğin parmak izini döner. Bir site bu değeri izleyerek değişikliği daha erken fark edebilir.

CMS erişilemezse

CMS'e ulaşılamadığında site "sayfa yok" demez. Hata yukarı iletilir ve ISR son iyi kopyayı sunmaya devam eder. Bir kesintiden sonra site kısa bir süre CMS'e hiç gitmez. Böylece ziyaretçi zaman aşımı beklemez.

Sitenin kendi sağlık ucu /api/health her zaman 200 döner. CMS'e erişilip erişilemediği gövdede yazar:

GET /api/health
{ "status": "ok", "preview": false, "cms": { "reachable": true, "unreachableSince": null, "lastSuccessAt": "…" } }

Üretimde site açılırken sayfaları sitemap.xml üzerinden ısıtır.

Önizleme sitesi ve canlı site

Aynı şablon iki kez dağıtılır: biri önizleme sitesi, biri canlı site.

Önizleme sitesiCanlı site
PREVIEW_MODEtrueayarlı değil
İçerikÖnizleme kopyası (taslak)Yayındaki
ÖnbellekHer istekte dinamik render, önbellek yokISR ve fetch önbelleği
NEXT_PUBLIC_INSPECTOR_ENABLEDtrueayarlı değil
robots.txtTüm siteyi engellerCMS parametrelerinden üretilir

PREVIEW_MODE yalnızca sunucuda okunur. Denetleyici bayrağı kapalıyken denetleyici kodu canlı pakete hiç girmez. Sitenin panelde iframe içinde açılabilmesi için frame-ancestors başlığı site adresinden türetilir. Farklı alan adındaki paneller next.config.ts içinde tanımlanır.

Yönlendirme kuralları önizleme sitesinde de aynen çalışır. Yönlendirmesi tanımlı bir sayfa önizlemede de kendi adresinde açılmaz.

Yönlendirmeler

Yönlendirmeler render'dan önce, proxy'de yapılır. Harita CMS'in GET /api/v1/redirect/all/{dil} listesinden kurulur. Zincirler tek adıma indirilir, döngüler atılır. Proxy sırası şöyledir:

Statik dosyalar atlanır.

Bozuk URL artıkları 301 ile temizlenir.

Yönlendirme haritası uygulanır.

Büyük harfli yollar küçük harfe 301 ile yönlendirilir.

Dil öneki çözülür ve istek içerik rotasına geçer.

Yalnızca gezinme istekleri yönlendirilir. Bir form POST'u eski adreste 301 almaz. Yönlendirme sorgusu başarısız olursa gezinme engellenmez.

Proxy'nin kaçırdığı bir istek için içerik rotasında bir güvenlik ağı vardır. redirectTo alanı dolu bir sayfa içerikle çizilmez, aynı harita üzerinden hedefe yönlendirilir.

Dil önekleri

Öneksiz dil src/lib/template-config.ts içindeki DEFAULT_LANGUAGE'dır. Diğer diller URL önekiyle gelir, örneğin /en/about. Açık diller src/lib/middleware/languages.ts içindeki TEMPLATE_LANGUAGES listesindedir.

src/lib/middleware/languages.ts
export const TEMPLATE_LANGUAGES: TemplateLanguage[] = [
  { code: "en", name: "English" },
  { code: "tr", name: "Turkish" },
];

DEFAULT_LANGUAGE bu listede yoksa modül açılışta hata verir. Bu bilinçli bir tercih: yanlış dil öneki sessizce yönlendirmeleri bozardı.

Sitemap, robots ve IndexNow

  • sitemap.xml CMS'in sayfa ağacından üretilir. Yayında olmayan, yayın tarihi gelmemiş veya geçmiş, noIndex işaretli, önizleme kopyası olan ve yönlendiren sayfalar girmez. Elle dışarıda tutmak istediğin yolları SITEMAP_EXCLUDED_PATHS listesine ekle.
  • robots.txt CMS'in herkese açık parametrelerinden üretilir: ROBOTS_AI_CRAWLERS yapay zekâ tarayıcılarının politikasını, ROBOTS_EXTRA_DISALLOW ek engelli yolları belirler. public/robots.txt dosyası ekleme, rotayı geçersiz kılar.
  • /indexnow.txt CMS'teki INDEXNOW_KEY parametresini düz metin olarak döner. CMS, IndexNow açıksa değişen adresleri arama motorlarına bildirir. Arama motoru anahtarı bu dosyadan doğrular.

İlgili sayfalar

Bu sayfada