🦔

CloudFront+S3構成のSPA Webアプリでルートページ以外に直で行ったときにAccessDeniedになった件について

2022/05/18に公開

React+React-router-domでパスで画面遷移ができるアプリケーションを作り、CloudFront+S3の構成でデプロイしました。

そうしたら、ルートページ「/」にはアクセス可能。
また、ルートページから「/hoge」に遷移した時にはAccessDeniedにならずに遷移する。

しかし、「/hoge」に直で移動するとAccessDeniedになるという事象に遭遇しました。

この現象はSPAはindex.htmlにアクセスしているから発生したのではないかと思います。

つまり、ルートページ経由で「/hoge」にアクセスした場合は、あくまでも"index.html"を見ていることになっているのですが、直接「/hoge」にアクセスした場合は"index.html"ではなく"hoge.html"を見ているとS3が認識しているようなのです。

実際には"hoge.html"は存在しないので、存在しないファイルにアクセスしているということでAccessDeniedになってしまうということですね。(たぶん)

ということで、CloudFrontでエラーページの設定をします。

403エラーの時に「/」に飛ばすことでこの問題が解決します。

まず最初にCloudFrontのエラーページ設定画面に行きます。
CloudFrontのエラーページ設定画面

そしたら「カスタムエラーレスポンスを作成」をクリックして下記のように設定します。
カスタムエラーレスポンスの設定項目

「"403: Forbidden"の時に即時(0s)で"/"に200で飛ばす」という設定です。
これにより、常にindex.htmlにアクセスしているという状態にできます。

カスタムエラーレスポンスの作成後の画面

カスタムエラーレスポンスを作成できるとこんな感じになります。

これにて終了です。

「/hoge」に直接アクセスしてみてください。
アクセスできるようになっているはずです。

Discussion