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ğipublic
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ğıdakis-maxage
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 ö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çinmax-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
veHEAD
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ıcaVary
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.