簡體   English   中英

Amazon Cloudfront Cache-Control:no-cache 標頭在 24 小時后無效

[英]Amazon Cloudfront Cache-Control: no-cache header has no effect after 24 hours

我在 S3 中托管一個靜態網站並使用 Cloudfront 來緩存文件。 我基本上有 3 個帶有以下標題的文件:

  • index.html(緩存控制:無緩存)
  • app.js (緩存控制: max-age=63072000, public)
  • style.css (Cache-Control: max-age=63072000, public)

我的 html 文件使用每次更新 css 或 js 文件時都會更新的查詢字符串參數。 我已經配置了 s3 來傳遞這些參數,並且我已經驗證它可以使緩存的資源無效。 我的 index.html 文件看起來像這樣:

<html>
    <head>
        ...
        <link rel="stylesheet" href="app.css?v=14113e2c764">
    </head>
    <body>
        ...
        <script src="app.js?v=14113e2c764"></script>
    </body>
</html>

當我整天推送更新時,它似乎工作得很好,但是當我第二天早上來推送我的下一個更改時,index.html 文件已過時。 它沒有正確的 ?v= 參數,而是舊的! 修復它的唯一方法是手動使 html 文件無效。 然后一切都在當天剩下的時間里工作。 第二天我又遇到了同樣的問題。

這里發生了什么?

驗證 CloudFront 分配的Minimum TTL是否設置為 0。如果設置為任何其他值,CloudFront 將不會遵守no-cache標頭,並且仍會緩存Minimum TTL的文件。 可以在此處找到有關緩存指令的更多詳細信息:

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

如果這沒有幫助,請嘗試調試index.html的實際 HTTP 請求並在此處發布響應標頭,以便我們查看它們。

此外,您可以嘗試使用,而不是對 index.html 文件使用no-cache

public, must-revalidate, proxy-revalidate, max-age=0

這將允許 CloudFront 將文件存儲在邊緣站點上,但它會強制它使用每個請求的源重新驗證它。 如果文件未更改,CloudFront 將不需要從源傳輸文件的全部內容。 這可以加快響應時間,尤其是對於較大的文件。

這更像是評論,但有點太長了。 希望能幫助到這里的其他人。

通過查詢參數清除緩存有一些缺點,但也許您可以通過 Cloudfront 行為來對抗它們。 請參閱https://stackoverflow.com/a/24166106/630614 不過,我會推薦唯一的文件名,例如app.css?v=14113e2c764變成app.14113e2c764.css

回應 BradLaney 的評論/問題:如果您更新了緩存控制標頭但沒有看到更改,那是因為原始項目已被緩存– 使其無效,您應該在下次查看資源時看到新標頭.

關於為 S3 項目設置緩存控制時的競爭條件,或者只是為 SPA 設置一般的緩存控制,這對我的團隊來說效果很好:

# Sync all files with 1 week cache-control, excluding .html files.
aws s3 sync --cache-control 'max-age=604800' --exclude *.html dist/ s3://$AWS_BUCKET/
# Sync remaining .html files with no cache.
aws s3 sync --cache-control 'no-cache' dist/ s3://$AWS_BUCKET/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM