ENGINEERING ARTICLE
CloudFrontと非公開S3で独自404ページを表示する方法|OAC構成に対応
この記事は約3分で読めます
こんにちは、 @Manabu です。
CloudFrontとS3で静的サイトを公開する場合、存在しないURLへアクセスした時にも、サイトのデザインに合った404ページを表示したいですよね。
ただ、OACを使ってS3を非公開にしている構成では、存在しないファイルに対して403が返る場合があります。
今回は、CloudFrontのカスタムエラーレスポンスを使って、独自の404ページを表示する方法を紹介します。
この記事は、以下のような方におすすめです。
こんな方におすすめ
- CloudFrontと非公開S3で静的サイトを公開している
- 存在しないURLへ独自の404ページを表示したい
- 404ページが200で返るソフト404を避けたい
404ページをS3へ配置する
最初に、サイトと同じS3バケットへ404ページを配置します。
/404.html
404ページ内のCSSや画像は、通常ページと同じようにルート相対パスで読み込めます。
<link rel="stylesheet" href="/assets/style.css">
CloudFrontのカスタムエラーレスポンス
CloudFrontのディストリビューションを開き、エラーページからカスタムエラーレスポンスを作成します。
404に対しては、次のように設定します。
| 項目 | 設定値 |
|---|---|
| HTTPエラーコード | 404 |
| レスポンスページのパス | /404.html |
| HTTPレスポンスコード | 404 |
| エラーキャッシュの最小TTL | 検証中は短い値 |
レスポンスコードを200へ変更すると、検索エンジンから通常ページとして認識されるソフト404になる可能性があります。
403も確認する
OACを設定したS3バケットオリジンでは、存在しないオブジェクトへのアクセスで403が返ることがあります。
実際に存在しないURLへアクセスし、ブラウザの開発者ツールやcurlでレスポンスコードを確認します。
curl -I https://example.com/not-found-page/
403が返る場合は、403に対しても/404.htmlを表示するカスタムエラーレスポンスを設定します。
ただし、S3のバケットポリシーやOAC設定が間違っている場合も403になります。正常なページまで403になる場合は、404設定ではなくS3へのアクセス権限を確認してください。
CloudFront Functionとの関係
ディレクトリ形式のURLをCloudFront Functionでindex.htmlへ変換している場合、存在しないURLも次のように変換されます。
/unknown-page/
↓
/unknown-page/index.html
変換後のファイルがS3に存在しないため、CloudFrontのカスタムエラーレスポンスによって/404.htmlを返します。
URL書き換えの実装は、以下の記事を参考にしてください。
REFERENCEOACで非公開S3を使う静的サイト!CloudFront Functionでindex.htmlへ変換IT自習室↗動作確認
設定後は、次の内容を確認します。
- 存在しないURLで独自404ページが表示される
- HTTPステータスコードが404になっている
- CSSや画像が表示される
- 正常な記事ページは200で表示される
- CloudFrontのキャッシュ削除後も同じ結果になる
まとめ
今回は、CloudFrontと非公開S3の構成で、独自404ページを表示する方法を紹介しました。
存在しないファイルが403と404のどちらになるか確認し、最終的なレスポンスコードは404にすることがポイントです。
404ページだけでなく、S3やOACの権限設定に問題がないことも一緒に確認しましょう。