2017-08-17 12 views
6

S3バケットにホストされているReactアプリがあります。コードはyarn build(これは作成反応型アプリベースのアプリ)を使用して縮小されています。私は(更新するmain.*.jsに六角サフィックスを引き起こす)コードを更新した場合、私が上で拾うために、ユーザの次の訪問を必要とするので、私は、index.htmlがキャッシュされたくないS3バケットでCloudFrontキャッシュindex.htmlを作成する方法

build 
├── asset-manifest.json 
├── favicon.ico 
├── images 
│   ├── map-background.png 
│   └── robot-icon.svg 
├── index.html 
├── js 
│   ├── fontawesome.js 
│   ├── packs 
│   │   ├── brands.js 
│   │   ├── light.js 
│   │   ├── regular.js 
│   │   └── solid.js 
│   └── README.md 
├── service-worker.js 
└── static 
    ├── css 
    │   ├── main.bf27c1d9.css 
    │   └── main.bf27c1d9.css.map 
    └── js 
     ├── main.8d11d7ab.js 
     └── main.8d11d7ab.js.map 

buildフォルダには、何かのように見えます<script src>index.htmlが更新されたコードを指すように変更されました。

CloudFrontでは、パスを除外しているように見えますが、「/」を除いても正しく動作していないようです。コードを変更したところで奇妙な動作が発生しています。リフレッシュすると表示されますが、Chromeを終了して元に戻った場合、何らかの理由で古いコードが表示されます。

(CodeBuildを介して)すべてのコードリリースで無効化をトリガーする必要はありません。別の方法がありますか?私は挑戦の1つは、React Routerを使用するアプリなので、エラー文書をindex.htmlに設定して、403の代わりにHTTPステータス200を強制することでトリッキーな作業をしなければならないと思います。

答えて

5

index.htmlをキャッシュする場合は、そのファイルにのみCache-Control: max-age=0ヘッダーを設定します。 CloudFrontはのすべてのリクエストで元のS3バケットにリクエストを返しますが、これは望ましい動作であるように思えます。

あなたは長い有効期限の時間を設定し、手動でCloudFrontのキャッシュを無効にしたい場合は、あなたの無効化パス(あなたが言及しているようではない/)として*または/*を使用することができます。ただし、世界中のすべてのCloudFrontエッジノードがオリジナルの変更を反映するのに15分かかることがあります。

+0

S3オブジェクトのメタデータにそのヘッダーを追加することについて話していますか? URLパスに関係なく、index.htmlをキャッシュすることは決してありません。私は、関連するファイル(JSファイル、CSS、イメージ)のキャッシュについてもっと心配しています。 – ffxsam

+0

はい:これはAWSドキュメントの「システム定義のメタデータ」と呼ばれています:http://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html –

+2

素晴らしい役に立った!インデックスファイルをコピーするときに 'aws s3 cp --cache-control max-age = 0'を使用するように私の展開プロセスを設定しました。魅力のように動作します。 – ffxsam

関連する問題