Önbellek davranışını yönet

Firebase Hosting, sitenizi olabildiğince hızlı hale getirmek için güçlü bir küresel CDN kullanır.

İstenen herhangi bir statik içerik, CDN'de otomatik olarak önbelleğe alınır . Sitenizin içeriğini yeniden dağıtırsanız Firebase Hosting, bir sonraki isteğe kadar CDN'de önbelleğe alınmış tüm içeriğinizi otomatik olarak temizler.

Ancak Cloud Functions ve Cloud Run hizmetleri içeriği dinamik olarak oluşturduğundan belirli bir URL'nin içeriği, kullanıcı girişi veya kullanıcının kimliği gibi etkenlere göre değişiklik gösterebilir. Bunu hesaba katmak için, arka uç kodu tarafından işlenen istekler varsayılan olarak CDN'de önbelleğe alınmaz .

Ancak dinamik içerik için önbelleğe alma davranışını yapılandırabilirsiniz . Örneğin, bir işlev yalnızca periyodik olarak yeni içerik oluşturuyorsa, oluşturulan içeriği en azından kısa bir süre için önbelleğe alarak uygulamanızı hızlandırabilirsiniz.

İçerik, tetiklenen bir işlev yerine CDN'den sunulduğundan, işlev yürütme maliyetlerini potansiyel olarak azaltmak için önbelleğe alma davranışını da benzer şekilde yapılandırabilirsiniz. Cloud Functions ve Cloud Run belgelerinde işlev yürütmeyi ve hizmetleri optimize etme hakkında daha fazla bilgi edinin.

Bunun istisnası, 404 hatası döndüren isteklerdir. CDN, hizmetinizin var olmayan bir URL'ye verdiği 404 yanıtını 10 dakika boyunca önbelleğe alır, böylece bu URL'ye yönelik sonraki istekler CDN'den sunulur. Hizmetinizi, içeriğin artık bu URL'de mevcut olacağı şekilde değiştirirseniz, CDN, önbelleğe alınmış herhangi bir 404'ü (en fazla) 10 dakika boyunca sunmaya devam eder ve ardından bu URL'deki içeriği normal şekilde sunar.

Bir 404 yanıtı zaten Cloud Functions veya Cloud Run hizmetiniz tarafından ayarlanan önbelleğe alma başlıklarını içeriyorsa, bunlar varsayılan 10 dakikalık süreyi geçersiz kılar ve CDN'nin önbelleğe alma davranışını tam olarak belirler.

Google'ın web geliştirici belgelerinde önbelleğe alma davranışı hakkında daha fazla bilgi edinin.

Önbellek Denetimini Ayarla

Dinamik içerik için önbelleği yönetmek için kullandığınız ana araç Cache-Control başlığıdır. Bu başlığı yapılandırarak içeriğinizin ne kadar süreyle önbelleğe alınabileceğini hem tarayıcıya hem de CDN'ye bildirebilirsiniz. İşlevinizde Cache-Control şu şekilde ayarlarsınız:

res.set('Cache-Control', 'public, max-age=300, s-maxage=600');

Bu örnek başlıkta, yönergeler üç şey yapar:

  • public — Önbelleği public olarak işaretler. Bu, hem tarayıcının hem de ara sunucuların (Firebase Hosting için CDN anlamına gelir) içeriği önbelleğe alabileceği anlamına gelir.

  • max-age — Tarayıcıya ve CDN'ye içeriği kaç saniye önbelleğe alabileceklerini bildirir. Ayarlanan süre sona erdiğinde, tarayıcı ve CDN'nin içeriği kaynak sunucuyla yeniden doğrulaması gerekir. Örnek başlıkta, tarayıcının ve CDN'nin içeriği beş dakika boyunca önbelleğe almasına izin veriyoruz (CDN önbelleğe almaya yönelik belirli kontroller için aşağıdaki s-maxage bakın).

  • s-maxage — Yalnızca CDN önbelleğe alma için max-age yönergesini geçersiz kılar; CDN'ye içeriği kaç saniye önbelleğe alabileceğini söyler. Ayarlanan süre sona erdiğinde CDN'nin içeriği kaynak sunucuyla yeniden doğrulaması gerekir. Örnek başlıkta, yalnızca CDN için max-age ayarını geçersiz kılıyoruz ve CDN'nin içeriği on dakika boyunca önbelleğe almasına izin veriyoruz.

max-age ve s-maxage için değerlerini, kullanıcıların eski içerik alması konusunda rahat olduğunuz en uzun süreye ayarlayın. Bir sayfa birkaç saniyede bir değişiyorsa küçük bir zaman değeri kullanın. Ancak diğer içerik türleri saatlerce, günlerce, hatta aylarca güvenli bir şekilde önbelleğe alınabilir.

Mozilla Geliştirici Ağı'nda ve Google'ın web geliştirici belgelerinde Cache-Control başlığı hakkında daha fazla bilgi edinebilirsiniz.

Önbelleğe alınan içerik ne zaman sunulur?

Tarayıcı ve CDN, içeriğinizi aşağıdakilere göre önbelleğe alır:

  • Ana makine adı
  • Yol
  • Sorgu dizesi
  • Vary başlığında belirtilen istek başlıklarının içeriği

Başlıkları değiştir

Vary başlığı, uygun bir yanıt sağlamak için hangi istek başlıklarının kullanılması gerektiğini belirler (önbelleğe alınan içeriğin geçerli olup olmadığı veya içeriğin kaynak sunucuyla yeniden doğrulanması gerekip gerekmediği).

Firebase Hosting, sık karşılaşılan durumlar için yanıtınıza otomatik olarak uygun bir Vary başlığı ayarlar. Çoğu zaman Vary başlığı hakkında endişelenmenize gerek yoktur. Ancak bazı gelişmiş kullanım durumlarında, önbelleği etkilemeniz gereken başka başlıklarınız da olabilir. Durum böyle olduğunda yanıtınızda Vary başlığını ayarlayabilirsiniz. Örneğin:

res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');

Bu durumda Vary başlığının değeri şöyledir:

vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization

Bu ayarlarla, farklı X-My-Custom-Header başlıklarına sahip, diğer açılardan aynı olan iki istek ayrı ayrı önbelleğe alınır. Hosting'in, dinamik içerik için bir istek yapıldığında varsayılan olarak Vary başlığına Cookie ve Authorization eklediğini unutmayın. Bu, kullandığınız herhangi bir oturum veya çerez yetkilendirme başlığının önbellek anahtarının bir parçası haline getirilmesini sağlar ve bu da içeriğin kazara sızmasını önler.

Ayrıca şunu da unutmayın:

  • Yalnızca GET ve HEAD istekleri önbelleğe alınabilir. Diğer yöntemleri kullanan HTTPS istekleri hiçbir zaman önbelleğe alınmaz.

  • Ayarları Vary başlığına eklerken dikkatli olun. Ne kadar çok ayar eklerseniz CDN'nin önbelleğe alınmış içerik sunma olasılığı o kadar azalır. Ayrıca Vary yanıt başlıklarını değil istek başlıklarını temel aldığını unutmayın.

Çerezleri kullanma

Firebase Hosting'i Cloud Functions veya Cloud Run ile birlikte kullanırken çerezler genellikle gelen isteklerden çıkarılır. Bu, verimli CDN önbellek davranışına izin vermek için gereklidir. Yalnızca özel olarak adlandırılan __session çerezinin uygulamanızın yürütülmesine geçmesine izin verilir.

Mevcut olduğunda, __session çerezi otomatik olarak önbellek anahtarının bir parçası haline getirilir; bu, farklı çerezlere sahip iki kullanıcının diğerinin önbelleğe alınmış yanıtını almasının imkansız olduğu anlamına gelir. __session çerezini yalnızca uygulamanız kullanıcı yetkilendirmesine bağlı olarak farklı içerik sunuyorsa kullanın.