web-dev-qa-db-ja.com

Amazon CloudFrontがS3ウェブサイトのバケットのindex.htmlルールを尊重しない

静的ウェブサイトホスティングオプションを使用してAmazon S3で静的ウェブサイトをホストしているので、S3は、index.htmlファイルを明示的に指定せずにフォルダーをレンダリングします。

たとえば、ここに私のS3バケット内のページへの直接リンクがあります: http://new.rdegges.com.s3-website-us-east-1.amazonaws.com/category/2009/ =ご覧のとおり、そのURLにアクセスすると、Amazon S3はそのディレクトリ内にindex.htmlファイルを自動的にレンダリングし、クリーンなURLを取得できるようにします。

これはすべてS3で正常に動作します。私が抱えている問題は、Amazon Cloudfrontがこの動作も適切に処理できるようにすることです。 S3バケットをオリジンとして指定してCloudfrontディストリビューションを作成し、 'index.html'をルートとして使用するように指示すると、S3が持っているindex.htmlの動作がまったく機能しなくなります。

たとえば、Cloudfrontでの上記と同じURLは次のとおりです。 http://d1mj00c6pby3gc.cloudfront.net/category/2009/

残念ながら、上記のURLは機能しませんが、手動でインデックスファイルを指定すると、たとえば、次のように機能します http://d1mj00c6pby3gc.cloudfront.net/category/2009/index.html

私の質問は、私のWebサイトのS3バケット設定を尊重するようにCloudfrontを構成するにはどうすればよいですか?

69
rdegges

S3ウェブサイトの機能は、Amazon CloudFrontと組み合わせて使用​​できます。ただし、S3 Webサイトは通常のS3バケットとは異なるドメイン名を使用します。この場合、CloudFrontディストリビューションのOrigin構成のOrigin Domain Namenew.rdegges.com.s3-website-us-east-1.amazonaws.comに設定する必要があります。

このURL(エンドポイント)は、S3のStatic Website Hostingパネルから取得できます。

Static Website Hosting panel on S3

CloudFrontがS3ウェブサイトのドメイン名を指すようになると、S3ウェブサイトの機能が動作するはずです。

109
Wade Matveyenko

受け入れられた回答にいくつかのことを追加したいと思います。

まず、クラウドの前面にDefault Root Objectがあることを確認してください。 documentation で指定されているように、これはsubdirectoriesには適用されません。

Cloudfrontの新しいディストリビューションをセットアップするときに、バケットbucket-name.s3.amazonaws.comを選択できます。リージョンはURLで指定されていないことに注意してください。あなたがする必要があるのは、s3から静的サイトのURLを取得し、それをOrigin urlとして使用することです(リージョンはそこにあります)。

17

これはゲームの後半になるかもしれませんが、 Lambda @ Edge をチェックしてください。拡張子なしでOrigin Requestsをインターセプトし、それらをフォルダー内のindex.htmlドキュメントにポイントできます。これらの結果はキャッシュされるため、Lambdaは新しいリクエストを受け取ったときにのみ実行されます。