Cloud CDN بخش مهمی از پشتیبانی App Hosting برای برنامه وب شما است. هر درخواستی که به backend شما ارسال میشود، ابتدا از Cloud CDN عبور میکند. محتوایی که از قبل در CDN ذخیره شده است، بلافاصله به کاربر بازگردانده میشود و نیازی به مراجعه به سرویس Cloud Run که کد سرور برنامه وب شما را اجرا میکند، نیست. میتوانید در web.dev درباره مزایای کلی CDNها بیشتر بدانید.
اگرچه پیکربندی اولیه Cloud CDN توسط App Hosting تنظیم شده و قابل تغییر نیست، اما میتوانید چندین کار را برای بهینهسازی ذخیرهسازی خود انجام دهید تا سرعت بارگذاری صفحه افزایش یابد، محتوای ذخیرهسازی نشدهی هزینهدار کاهش یابد و ترافیک Cloud Run به حداقل برسد.
محتوای قابل ذخیره سازی
اگر همه شرایط زیر برقرار باشد، Cloud CDN پاسخها را در حافظه پنهان ذخیره میکند:
درخواست از نوع GET است
پاسخ دارای کد وضعیت
200،203،204،206،300،301،302،307،308،404،405،410،421،451یا501است.پاسخ دارای یک هدر
Cache-Controlبا دستورالعملmax-ageیاs-maxageیا یک هدرExpiresبا یک مهر زمانی در آینده است.پاسخ دارای یک هدر
Ageیا یک هدرCache-Controlبا یک دستورالعملpublicصریح است.حجم پاسخ کمتر یا مساوی 10 مگابایت است.
و هیچ یک از موارد زیر صحیح نیست:
پاسخ دارای یک هدر
Set-Cookieاست.پاسخ دارای یک سرآیند
Varyبا مقداری غیر ازAccept،Accept-Encoding،Access-Control-Request-Headers،Access-Control-Request-Method،Origin،Sec-Fetch-Dest،Sec-Fetch-Mode،Sec-Fetch-Site،X-Goog-Allowed-Resources،X-Origin،RSC،Next-Router-State-Tree،Next-Router-PrefetchیاNext-Router-Segment-Prefetch.پاسخ دارای یک هدر
Cache-Controlبا دستورالعملno-storeیاprivateاست.این درخواست دارای یک هدر
Cache-Controlبا دستورالعملno-storeاست.درخواست دارای یک هدر
Authorizationheader) است، مگر اینکه پاسخ دارای یک دستورالعمل کنترل حافظه پنهان (cache control directive) صریح باشد.
سفارشیسازی رفتار با دستورالعملهای کنترل حافظه پنهان
بعدی.js
 Next.js دستورالعملهای کنترل حافظه پنهان را به طور ضمنی و بر اساس تعدادی از عوامل تنظیم میکند. با این حال، میتوانید با تنظیم دستی هدر در فایل next.config.js خود، این موارد را نادیده بگیرید. به عنوان مثال، برای اطمینان از اینکه یک صفحه در Cloud CDN ذخیره نمیشود:
  /** @type {import('next').NextConfig} */
  const nextConfig = {
      headers: async () => [{
          source: "/YOUR_PRIVATE_PAGE",
          headers: [{
              key: "Cache-Control",
              value: "private"
          }],
      }],
  };
زاویه دار
Angular SSR دستورالعملهای کنترل حافظه پنهان (cache-control) را به صورت پیشفرض تنظیم نمیکند. میتوانید با مشخص کردن هدرهای کنترل حافظه پنهان (cache-control) در مسیرهای سرور خود، دستورالعملهای خودتان را اضافه کنید. به عنوان مثال، برای اینکه به Cloud CDN اجازه دهید تمام صفحات را به مدت یک ساعت ذخیره کند:
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
  {
    path: '**',
    renderMode: RenderMode.Prerender,
    headers: {
      'Cache-Control': 'public, max-age=3600',
    }
  }
];
یا برای اطمینان از اینکه یک صفحه خاص ذخیره نمیشود :
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
  // ... other routes
  {
    path: 'YOUR_PRIVATE_PAGE',
    renderMode: RenderMode.Server,
    headers: {
      'Cache-Control': 'private',
    }
  }
];
دستورالعملهای محترم
نمونه Cloud CDN مربوط به Firebase App Hosting از دستورالعملهای کنترل حافظه پنهان زیر پیروی میکند:
| دستورالعمل | درخواست | پاسخ | 
|---|---|---|
 no-store | وقتی در یک درخواست وجود داشته باشد، پاسخ ذخیره نمیشود. |  پاسخی که no-store در آن نباشد، ذخیره نمیشود. | 
 no-cache |  دستورالعمل درخواست no-cache request) نادیده گرفته میشود تا از شروع یا اعمال اعتبارسنجی مجدد به مبدا توسط کلاینتها جلوگیری شود. |  پاسخی که no-cache کش میشود اما قبل از ارائه باید توسط مبدا مجدداً اعتبارسنجی شود. | 
 public | ناموجود | این دستورالعمل برای قابلیت ذخیرهسازی در حافظه پنهان (cacheability) الزامی نیست، اما بهترین روش این است که آن را برای محتوایی که باید توسط پروکسیها ذخیرهسازی شوند، لحاظ کنید. | 
 private | ناموجود |  پاسخی که با دستورالعمل private ارائه شده باشد، توسط Cloud CDN ذخیره نمیشود، حتی اگر پاسخ از جهات دیگر قابل ذخیره در حافظه پنهان در نظر گرفته شود. کلاینتها (مانند مرورگرها) ممکن است همچنان نتیجه را ذخیره کنند. برای جلوگیری از ذخیره کامل پاسخها no-store استفاده کنید. | 
 max-age=SECONDS |  دستورالعمل درخواست max-age نادیده گرفته میشود. یک پاسخ ذخیرهشده برگردانده میشود، انگار که این هدر در درخواست گنجانده نشده است. |  پاسخی که شامل دستورالعمل max-age باشد، تا ثانیههای تعریفشده در حافظه پنهان (cache) ذخیره میشود. | 
 s-maxage=SECONDS | ناموجود |  پاسخی که شامل دستورالعمل s-maxage باشد، تا ثانیههای تعریفشده در حافظه پنهان (cache) ذخیره میشود. اگر هر دو max-age و s-maxage موجود باشند، s‑maxage توسط Cloud CDN استفاده میشود. پاسخهای حاوی این دستورالعمل، بیکیفیت ارائه نمیشوند. s-max-age (دو خط فاصله) برای اهداف ذخیرهسازی معتبر نیست. | 
 max-stale=SECONDS |  دستورالعمل درخواست max-stale حداکثر زمان بیثمری (برحسب ثانیه) را که کلاینت مایل به پذیرش آن است، تعیین میکند. Cloud CDN به این موضوع احترام میگذارد و تنها در صورتی که زمان بیثمری پاسخ کمتر از دستورالعمل max-stale باشد، یک پاسخ ذخیرهشدهی بیثمر برمیگرداند. در غیر این صورت، قبل از ارائه درخواست، اعتبارسنجی مجدد انجام میشود. | ناموجود | 
 stale-while-revalidate=SECONDS | ناموجود |  پاسخی با stale-while-revalidate تا حداکثر ثانیه به کلاینت ارائه میشود، در حالی که اعتبارسنجی مجدد به صورت غیرهمزمان انجام میشود. | 
 must-revalidate | ناموجود |  پاسخی که شامل must-revalidate باشد، پس از انقضا، توسط سرور مبدا مجدداً اعتبارسنجی میشود. پاسخهایی که دارای این دستورالعمل باشند، به صورت قدیمی ارائه نمیشوند. | 
 proxy-revalidate |  پاسخی که با proxy-revalidate ارسال میشود، پس از انقضا، توسط سرور مبدا مجدداً اعتبارسنجی میشود. پاسخهایی که با این دستورالعمل ارائه میشوند، قدیمی (stale) ارائه نمیشوند. | |
 no-transform | ناموجود | هیچ تبدیلی توسط Cloud CDN اعمال نمیشود. | 
اندازهگیری ترافیک ذخیرهشده و ذخیرهنشده
نمودار «Cloud CDN - پهنای باند خروجی» در تب Usage کنسول App Hosting ، بایتهای کششده و کشنشدهی ارائه شده را نشان میدهد و برای هر مرحله یک علامت دارد. میتوانید از این نمودار برای سنجش اثربخشی تلاشهای بهینهسازی کش خود استفاده کنید.
همچنین میتوانید با استفاده از Route-based Monitoring، میزان موفقیت در کش را برای مسیرهای خاص در برنامه وب خود مشاهده کنید.