web-dev-qa-db-ja.com

S3静的ウェブサイトインデックスドキュメント

静的ウェブサイトをs3バケットにアップロードしようとしています。私はなんとかこれを達成することができました。 my_bucketを作成してから、test_folderという名前のsub_bucketを作成し、その中ですべてのcss、html、jsファイルをアップロードしました。

今は次のようになります。

 my_bucket/
  test_folder
    index.html

そして、index.htmlを表示することができました。 :D。しかし、私の質問は、index.htmlがsub_bucketにあるため、インデックスドキュメントを設定することです。保存しようとすると、test_folder /index.htmlが表示されます。

IndexDocumentサフィックスが適切に形成されていません

Sub_bucketでindex.htmlをリンクすることは可能ですか?はいの場合、どのように?そうでない場合、これを達成するための代替方法はありますか?ここにスクリーンショットがあります リンク

14
user2720708

多くの場合、さまざまな目的で使用されますが、インデックスドキュメントは元々、概念的には、各フォルダ内のすべてのファイルの「インデックス」(ディレクトリリストまたはその他のコンテンツの概要)であることが意図されていたため、この構成パラメータは、返すインデックスドキュメントを指定しますバケット全体の各フォルダについて、そのようなドキュメントがフォルダ内に存在する場合...これはバケットの単一の構成「もの」ではありません。全体。

試行した構成がS3によって受け入れられた場合、バケット名を「example.com」とすると、次のような影響があります。

browser address bar          file (object) actually returned
---------------------------  ------------------------------------
http://example.com           example.com/test/index.html
http://example.com/help      example.com/help/test/index.html
http://example.com/foo/test  example.com/foo/test/test/index.html

これがあなたが実際に意図したものである可能性は非常に低いようです。

ただし、これがインデックスドキュメントの仕組みです...概念的には、ディレクトリ階層の各レベルで他のものに関連付けることを目的としています。もちろん、ファイルの実際のリストである場合もあれば、の「インデックス」である場合もあります。訪問者がサイトの特定の「ディレクトリ」にアクセスしたときに表示するランディングページなど、「ページ」のはるかに広範で曖昧で一般的な意味。もちろん、現代のWebでは通常はそうではありません。 「ディレクトリ」として概念化されていますが、単に「ページ」として概念化されています。

したがって、インデックスドキュメントは同じ/区切り文字のすぐ下にある必要があり、独自の仕様内に追加の/を含めることはできません。

Example.comのインデックスドキュメントは、example.com/index.htmlに保存する必要があります(「index.html」が選択したインデックスファイル名であると想定)-インデックスを作成する「ディレクトリ」内に保存する必要があります。従来のWebサーバーでは、一部の構成では、Webサーバーは実際にファイルのディレクトリリストを表示し、「インデックス」ページが実際に存在する場合は、「インデックス」ページがそのディレクトリリストを置き換えます。もちろん、S3にはデフォルトのディレクトリリストページ機能はありません。

http://docs.aws.Amazon.com/AmazonS3/latest/dev/IndexDocumentSupport.html

インデックスドキュメントとは対照的に、エラードキュメントは、構成する場合、バケット内のどこで404が発生するかに関係なく使用されるグローバル構成であるため、そのエントリではスラッシュがサポートされます。 AWSコンソールのプロンプトは、2つのエントリの性質に関するヒントを軽く示しています。これらのエントリは動作が非常に異なるため、視覚的に分離する必要があります。


「サブバケット」は、説明している内容の実際の用語ではないことに注意してください。これは、キー(パス)に区切り文字が含まれるオブジェクトであり、ディレクトリまたはフォルダーの下にネストされているように見えます。

わかりやすくするために、この回答全体で「フォルダ」と「ディレクトリ」という言葉を非常にカジュアルに使用しましたが、技術的な正確さのために、S3オブジェクトは実際には階層的に内部に保存されていません。 「ディレクトリ内。」このように表示され、実用的な目的では、そのように機能します。ただし、実際には、/文字は、オブジェクトキー内の単なる別の文字に近いものの、ディレクトリ区切り文字としての従来の使用のために区切り文字として特別な扱いを受けますが、実際にはそうです。ファイルシステムの場合、「各ディレクトリ内のファイル」の数はS3でパフォーマンスの問題を引き起こさず、ファイルが多数存在する場合に従来のファイルシステムで必要とされるのと同じ方法で管理する必要はありません。 S3は、内部ストレージパーティショニングロジックの各オブジェクトのキー (「パス」)を内部的にハッシュします。

17

私もこの問題を抱えていました。 Michaelの回答に基づいて、私はこの回避策を開発しました。

Amazon S3バケットのプロパティで、Index Document:値を任意の値に設定します(「index.htm」を使用し、バケットの「root」にindex.htmファイルがありませんでした。次にエラードキュメントを設定します:ユーザーを送信したい場所(この場合はtest_folder/index.html)に値を設定します。

サイト上の404エラーメッセージはすべて、指定されたページに送信されることに注意してください。これは恐ろしい回避策であることは知っていますが、私にとってはうまくいくようです。他の提案はありがたく受け入れました!

7
Nick

私は同じことをしようとしていて(s3から静的に提供)、この投稿を読んで、インデックスファイル(例: 'index.html')をバケットに配置する必要があることに気付きましたoutside of任意のフォルダ。

テンプレートフォルダにインデックスドキュメントがありました。ドキュメントを読んだことがありますが、本当に何を言っているのか理解できないほどイライラしていました。時々、本当にばかげた間違いはトラブルシューティングするのが最も難しいです。これが誰かに役立つことを願っています。

5
justa_just

「インデックスドキュメント」セルにindex.htmlを入力してみてください。

1
Joe Cheng

最も簡単な方法は、クラウドフロントでs3を使用し、その「フォルダー」が存在するバケットを選択した後、Origin Pathtest_folder/index.htmlに設定することです。

0
Allan Guwatudde

別の方法は、S3でクラウドフロントを使用している(または使用している)場合、

DefaultRootObject:test_folder/index.html

このようにして、クラウドフロントURL https:// yourdomain / はtest_folder /index.htmlを返します

0
Sourabh