Firebase Hosting, sitenizi mümkün olduğunca hızlı hale getirmek için güçlü bir küresel CDN kullanır.
İstenen tüm statik içerikler 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'deki tüm önbelleğe alınmış içeriğinizi otomatik olarak temizler.
Bununla birlikte, Cloud Functions ve Cloud Run hizmetleri dinamik olarak içerik oluşturduğundan belirli bir URL'nin içeriği, kullanıcı girişi veya kullanıcı kimliği gibi unsurlara göre değişiklik gösterebilir. Bu nedenle, 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 kısa bir süre için önbelleğe alarak uygulamanızı hızlandırabilirsiniz.
Benzer şekilde, iç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ı yapılandırabilirsiniz. İşlev yürütme ve hizmetleri optimize etme hakkında daha fazla bilgiyi Cloud Functions ve Cloud Run dokümanlarında bulabilirsiniz.
404 hatası döndüren istekler istisnadır. CDN, hizmetinizin var olmayan bir URL'ye verdiği 404 yanıtını 10 dakika boyunca önbelleğe alır. Böylece, söz konusu URL için sonraki istekler CDN'den sunulur. İçeriğinizin bu URL'de bulunduğu şekilde hizmetinizi değiştirirseniz CDN, önbelleğe alınmış 404'leri en fazla 10 dakika boyunca yayınlamaya devam eder ve ardından içeriği bu URL'den normal şekilde sunar.
Bir 404 yanıtı, Cloud Functions veya Cloud Run hizmetiniz tarafından ayarlanan önbelleğe alma üst bilgilerini zaten içeriyorsa bu üst bilgiler, varsayılan 10 dakika süresini geçersiz kılar ve CDN'nin önbelleğe alma davranışını tamamen belirler.
Google'ın web geliştirici dokümanlarında önbelleğe alma davranışı hakkında daha fazla bilgi edinin.
Cache-Control ayarlama
Dinamik içeriklerin önbelleğini yönetmek için kullandığınız ana araç Cache-Control
üstbilgisidir. Bu başlığı yapılandırarak içeriğinizin ne kadar süre boyunca önbelleğe alınabileceğini hem tarayıcıya hem de CDN'ye bildirebilirsiniz. Fonksiyonunuzda, Cache-Control
öğesini ş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ğipublic
olarak işaretler. Bu, hem tarayıcının hem ara sunucuların (yani Firebase Hosting için CDN'nin) içeriği önbelleğe alabileceği anlamına gelir.max-age
: Tarayıcıya ve CDN'ye içeriği kaç saniye boyunca önbelleğe alabileceğini bildirir. Ayarlanan süre sona erdiğinde tarayıcı ve CDN, içeriği kaynak sunucuda yeniden doğrulamalıdır. Ö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 almayla ilgili belirli kontroller için aşağıdakis-maxage
bölümüne bakın).s-maxage
: Yalnızca CDN önbelleğe alma içinmax-age
yönergesini geçersiz kılar; CDN'ye içeriği kaç saniye boyunca önbelleğe alabileceğini söyler. Belirlenen süre dolduğunda CDN'nin içeriği kaynak sunucuyla tekrar doğrulaması gerekir. Örnek başlıkta,max-age
ayarını yalnızca CDN için geçersiz kılıyor 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çerikler almasına izin vereceğiniz 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.
Cache-Control
üstbilgisi hakkında daha fazla bilgiyi Mozilla Developer Network'ta ve Google'ın web geliştirici belgelerinde bulabilirsiniz.
Önbelleğe alınmış içerik ne zaman yayınlanır?
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
Vary üstbilgileri
Vary
başlığı, uygun bir yanıt sağlamak için hangi istek başlıklarının kullanılması gerektiğini (önbelleğe alınmış içeriğin geçerli olup olmadığı veya içeriğin kaynak sunucuyla yeniden doğrulanmasının gerekip gerekmediğini) belirler.
Firebase Hosting, sık karşılaşılan durumlar için yanıtınızda otomatik olarak uygun bir Vary
başlığı belirler. Çoğu zaman Vary
başlığıyla ilgili endişelenmenize gerek yoktur. Ancak bazı gelişmiş kullanım alanlarında, önbelleği etkilemeniz gereken başka üstbilgileriniz olabilir. Bu durumda, yanıtınızda Vary
üstbilgisini ayarlayabilirsiniz. Örneğin:
res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');
Bu durumda, Vary
üstbilgisinin değeri şu şekildedir:
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 ancak diğer açılardan aynı olan iki istek ayrı ayrı önbelleğe alınır. Hosting, dinamik içerik için istek yapıldığında varsayılan olarak Vary
başlığına Cookie
ve Authorization
eklediğini unutmayın. Bu sayede, kullandığınız tüm oturum veya çerez yetkilendirme üstbilgilerinin önbelleğe alma anahtarının bir parçası olması sağlanır. Bu da içeriğin yanlışlıkla sızmasını önler.
Ayrıca şunlara dikkat edin:
Yalnızca
GET
veHEAD
istekleri önbelleğe alınabilir. Diğer yöntemleri kullanan HTTPS istekleri hiçbir zaman önbelleğe alınmaz.Vary
başlığına ayar eklerken dikkatli olun. Ne kadar çok ayar eklerseniz CDN'nin önbelleğe alınmış içerik yayınlama olasılığı o kadar azalır. AyrıcaVary
'ün yanıt başlıklarına değil, istek başlıklarına dayandığını unutmayın.
Çerezleri kullanma
Firebase Hosting, Cloud Functions veya Cloud Run ile birlikte kullanıldığında çerezler genellikle gelen isteklerden kaldırılır. Bu, verimli CDN önbellek davranışına izin vermek için gereklidir.
Yalnızca özel olarak adlandırılmış __session
çerezinin uygulamanızın yürütülmesine iletilmesine izin verilir.
Mevcut olduğunda __session
çerezi otomatik olarak önbellek anahtarının bir parçası haline gelir. 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.