[英]Tell CloudFront to only cache 200 response codes
是否可以將Amazon CloudFront配置為僅緩存200個代碼? 我希望它永遠不會緩存3xx,因為我想將它連接到一個動態圖像處理工具,Lambda通過S3執行307,如描述https://aws.amazon.com/blogs/compute/resize-images-在即時與-亞馬遜S3-AWS-λ-和亞馬遜API網關/
除非您可以配置源以相應地設置Cache-Control
標頭,否則無法明確告知CloudFront僅緩存2XX而不緩存3XX - CloudFront將2XX和3XX視為“成功”並將它們視為相同。 (它僅對4XX和5XX有不同的規則,對條件請求的304響應有明顯的例外。)
在S3重定向的情況下,問題在於S3重定向規則不允許設置Cache-Control
標頭。
但是,如果您正在設置Cache-Control
正確的對象標題,當你在S3創建它們-因為你應該-那么你可以probably¹依靠CloudFront的的Default TTL
設置完全解決問題,告訴CloudFront的是響應缺少Cache-Control
標頭不應該被緩存。 這意味着將Default TTL
設置為0,並且當然要求Minimum TTL
也設置為0,因為最小<= default是必需的。
Maximum TTL
應保留其默認值,因為它用於縮短 max-age
大於Maximum TTL
對象的CloudFront緩存時間。 您可能不希望縮短2XX響應的可緩存性。
假設瀏覽器行為正常並且沒有緩存重定向(對於307或302它們不應該這樣),那么您的問題就會得到解決,因為CloudFront在此配置中的行為與預期相同 - 當Cache-Control
時,它會表現出來,而不是緩存當它不存在時的回答。
但是,如果您發現瀏覽器或其他下游緩存持有您的重定向,您可能必須更積極。
在原點不提供響應時,將Cache-Control
(或其他標題)顯式添加到響應的唯一方法是使用Lambda @ Edge。 以下代碼用作OriginResase²觸發器,可以為從源服務器接收的任何3XX
HTTP響應添加Cache-Control: no-cache, no-store, private
(是的,它有點冗余)。 如果原始響應中存在任何Cache-Control
標頭,則它將被覆蓋。 任何其他響應(例如2XX)都不會被修改。
'use strict';
// add Cache-Control: no-cache, ... only if response status code is 3XX
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
if (response.status.match(/^30[27]/))
{
response.headers['cache-control'] = [{
key: 'Cache-Control',
value: 'no-cache, no-store, private'
}];
}
callback(null, response);
};
有了這個觸發器,2XX響應沒有修改其標題,但302/307響應將被修改,如圖所示。 這將告訴CloudFront和瀏覽器不要緩存響應。
¹ 可能 ......並不意味着CloudFront 可能只是做正確的事情。 CloudFront的行為完全符合預期。 大概是指這個是唯一需要的行動:你也許可以考慮這種解決方案足夠了,因為很可能瀏覽器將不緩存重定向。 像往常一樣,瀏覽器行為是通配符,可能需要更積極地添加顯式Cache-Control
標頭以防止瀏覽器緩存重定向。
² 地響應觸發檢查並可以修改他們緩存之前(如果它們被緩存),並返回給瀏覽器的響應某些方面。 在流中的此處修改或添加Cache-Control
標頭將阻止響應存儲在CloudFront緩存中,並且還應阻止瀏覽器緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.