來自具有 S3 源的 AWS CloudFront 的文件沒有記憶體控制標頭
我們剛剛遷移到亞馬遜 AWS。我們目前有一個執行良好的 EC2 實例。它在前端執行 Nginx,在後端執行 Apache。這也執行良好。所有站點均已正確啟動,並包含從 EC2 提供的文件的 Cache-Control 標頭。
問題在於我們放置在通過*CloudFront CDN訪問的Amazon S3*中的所有靜態文件。我們可以正常訪問文件(CORS 沒有問題),但顯然CloudFront 不提供帶有 Cache-Control 標頭的文件。**我們想利用瀏覽器記憶體。
在我看來,EC2 實例在這裡不起作用,因為靜態文件直接由 S3+CloudFront 提供服務,請求不會轉到 EC2 中的 Web 伺服器。
我完全迷路了。
問題:1)在這種情況下如何設置記憶體控制?2)是否可以設置記憶體控制?來自 S3 還是 CloudFront?
注意:我在 Google 中找到了一些頁面,您可以在其中為單個對象設置 S3 中的 Header。這真的不是一種特別有效的方法,因為在我的例子中,我們正在談論幾個對象。
謝謝!
我在 Google 中找到了幾頁,您可以在其中為單個對象設置 S3 中的 Header。這真的不是一種特別有效的方法,因為在我的例子中,我們正在談論幾個對象。
好吧,不管是否“高效”,這就是它的實際設計方式。
CloudFront 不添加
Cache-Control:
標頭。CloudFront傳遞 *(並且也尊重,除非另有配置)*源伺服器提供的
Cache-Control:
標頭,在本例中為 S3。要在獲取
Cache-Control:
對象時獲取 S3 提供的 headers,必須在對像上傳到 S3 時提供,或者通過後續的 put+copy 操作添加到對象的元數據中,可用於在內部將對象複製到自身中S3、修改過程中的元數據。如果您編輯對像元數據,這就是控制台在幕後所做的事情。S3 中還沒有(如果您想知道)沒有全域設置來強制儲存桶中的所有對象返回這些標頭——它是每個對象的屬性。
更新: Lambda@Edge 是 CloudFront中的一項新功能,允許您在查看器和記憶體和/或記憶體和源之間針對請求和/或響應觸發觸發器,針對簡單的請求/響應對象結構執行用 Node.js 編寫的程式碼由 CloudFront 公開。
此功能的主要應用程序之一是操作標頭……因此,儘管上述內容仍然準確 - CloudFront 本身沒有添加
Cache-Control
- 現在可以讓 Lambda 函式將它們添加到從 CloudFront 返回的響應中。此範例僅在響應
Cache-Control: public, max-age=86400
中沒有標頭時添加。Cache-Control
在源響應觸發器中使用此程式碼將導致它在每次 CloudFront 從源獲取對象時觸發,並在 CloudFront 記憶體響應之前修改響應。
'use strict'; exports.handler = (event, context, callback) => { const response = event.Records[0].cf.response; if(!response.headers['cache-control']) { response.headers['cache-control'] = [{ key: 'Cache-Control', value: 'public, max-age=86400' }]; } callback(null, response); };
更新(2018-06-20):最近,我向 CloudFront 團隊送出了一個功能請求,允許將靜態源響應標頭配置為源屬性,類似於添加靜態請求標頭的方式,現在…扭曲,允許將每個標頭配置為有條件地添加(僅當源未在響應中提供該標頭時)或無條件地(添加標頭並從該來源覆蓋標頭,如果存在)。
對於功能請求,您通常不會收到任何關於他們是否真的在考慮實施新功能的確認……甚至他們是否可能已經在研究它……它只是在他們完成時宣布。所以,我不知道這些是否會實施。有一個論點是,由於此功能已經通過 Lambda@Edge 提供,因此在基本功能中不需要它……但我的反駁是,如果沒有能力,基本功能在功能上是不完整的進行簡單的靜態響應標頭操作,如果這是需要觸發器的唯一原因,那麼需要 Lambda 觸發器是不必要的成本,在財務上和增加的延遲(儘管兩者都不一定是奇怪的成本)。