CDN是否可以返回缓存状态头?实用设置方法与优化技巧
做CDN這行十幾年,每次聽到有人問「CDN能不能返回緩存狀態頭」,我就想起早期踩過的坑。那時幫一家電商平台優化網站,客戶投訴頁面載入慢得像蝸牛,查了半天才發現CDN緩存頭沒設好,瀏覽器根本沒快取靜態資源,白白浪費頻寬。今天來聊聊這個實務問題,順便分享我的設定心法和優化技巧,讓大家少走彎路。
CDN當然可以返回緩存狀態頭,這是基本功。但關鍵在於「怎麼設」和「為什麼設」。緩存頭像是HTTP回應的指令牌,比如Cache-Control、Expires或ETag,它們告訴瀏覽器或中間節點:「這張圖片能快取多久」「要不要重新驗證」。CDN作為中間層,能根據源伺服器設定或自身規則覆寫這些頭。舉個實例,用Cloudflare時,如果你在「快取規則」裡手動添加Cache-Control: max-age=86400,用戶訪問時CDN就會返回這個頭,指示快取一天。反之,如果源伺服器已經設了Expires頭,CDN預設會繼承,但你可以透過頁面規則調整成更激進的策略。
實用設定方法得看CDN服務商。以Akamai和Cloudflare為例,操作略有不同。Akamai的Property Manager是個寶藏,登入控制台後,在「行為」選項新增「修改回應頭」動作,選擇添加Cache-Control並設定max-age值,比如3600秒給動態內容。記住,別一股腦設成public, max-age=31536000,萬一源站更新了CSS檔,用戶可能卡在舊版本。Cloudflare更直覺,進Speed選單的「最佳化」分頁,啟用Brotli壓縮時順便勾選「快取層級」,自訂Cache-Control頭。實戰中,我習慣搭配Edge Rules:如果請求路徑是/images/,就附加s-maxage=604800;針對登入頁面則設成no-store,避免快取敏感session。小技巧:先用瀏覽器開發者工具檢查回應頭,確認CDN是否正確返回,避免設定被防火牆攔截。
優化技巧關乎效能與安全。第一,分層快取策略是核心。靜態資源如JS、CSS設max-age=2592000(30天),並加上immutable屬性,減少重新驗證請求。動態API路徑用max-age=60,搭配stale-while-revalidate,讓CDN在背景更新快取,用戶無感等待。第二,監控命中率是關鍵。裝個Datadog或New Relic,追蹤CDN快取命中率低於90%的URL,八成是頭部設太短或ETag衝突。曾遇過一家媒體網站,圖片ETag用預設伺服器時間戳,每次訪問都觸發304回應,拖慢速度,改成內容hash後TPS飆升40%。第三,安全防護別輕忽。針對管理後台路徑,強制no-cache並啟用HSTS,避免XSS攻擊利用快取漏洞。最後,定期用WebPageTest模擬全球訪問,確保不同地區CDN節點返回的頭部一致,東南亞用戶不該拿到和歐美不同的Expires值。
這些年看過太多設定失誤案例,比如電商促銷頁因CDN快取頭過期,瞬間流量壓垮源站。記住,緩存狀態頭不是設完就忘,得結合業務場景迭代。下次有人說CDN加速無感,先查頭部就對了。
评论: