React S3バケットでホストされているアプリです。コードはyarn build
(create-react-appベースのアプリです)を使用して縮小されます。build
フォルダーは何かのようなもの:
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
index.html
をキャッシュしたくないのは、コードを更新する場合(main.*.js
の16進数の接尾辞を更新する場合)、<script src>
の変更を取得するためにユーザーが次にアクセスする必要があるためです。 index.html
で、更新されたコードを指します。
CloudFrontでは、パスのみを除外しているように見えますが、「/」を除外しても正しく機能しないようです。コードを変更するという奇妙な動作をしており、リフレッシュを押すと表示されますが、Chromeを終了して戻ると、何らかの理由で非常に古いコードが表示されます。
すべてのコードリリース(CodeBuild経由)で無効化をトリガーする必要はありません。他の方法はありますか?チャレンジの1つは、これがReact Routerを使用するアプリであるため、エラードキュメントをindex.html
に設定し、HTTPステータスを強制することにより、いくつかのトリックを行う必要があることだと思います403の代わりに200。
index.html
をキャッシュするには、Cache-Control: max-age=0
ファイルのヘッダーのみ。 CloudFrontはeveryリクエストでOrigin S3バケットにリクエストを返しますが、これは望ましい動作のようです。
より長い有効期限を設定し、CloudFrontキャッシュを手動で無効にしたい場合は、*
または/*
無効化パスとして(/
あなたが言及したように)。ただし、世界中のすべてのCloudFront EdgeノードがOriginの変更を反映するには、最大15分かかります。
CloudFront構成に基づくソリューション:
CloudFrontディストリビューションの[動作]タブで、新しい動作を作成します。次の値を指定します。
この構成を保存します。
CloudFrontはキャッシュしませんindex.html
もう。
新しいファイルをs3にアップロードしてCloudfrontを無効にした後、index.htmlファイルにcache-controlを設定するために実行したコマンドは次のとおりです。
aws s3 cp s3://bucket/index.html s3://bucket/index.html --metadata-directive REPLACE --cache-control max-age=0