web-dev-qa-db-ja.com

.html拡張子のないS3静的ページ

Amazon S3から静的サイトを提供する際に、各ページの.htmlファイル拡張子を取り除く方法を知りたいと思っています。

今私は持っています:

mysite.com/             # works fine, serves index.html
mysite.com/mypage.html  # works fine
mysite.com/mypage       # doesn't work

/mypageのエラー:

404 Not Found

Code: NoSuchKey
Message: The specified key does not exist.
Key: mypage
RequestId: 1089D7A26EFED9AD
HostId: Ud8cFy8Zl1mJ+oFjFOmU1Xacq9+v70KuaJfOc4nFMEPhd66AkLhr4Pj5u0QH6Gog

この投稿 に従って、Content-Typetext/htmlに設定しようとしましたが、問題は解決しません。

S3の/mypageでファイルを提供するために/mypage.htmlを取得するにはどうすればよいですか?

55
Tyler

私はこの問題を抱えていたので、解決策を共有したいと思います:

ファイルのメタデータContent-typetext/htmlに設定し、ファイルの名前を変更して最後の.htmlを削除する必要があります。

そうすれば、ファイル拡張子なしですべてのページにアクセスできます。

74
André Lucas

一般にAmazon S3では、クリーンなURLを作成するために次のことができます。

  1. 「クリーン」な名前でページファイルをアップロードします。 mypageを設定し、Content-Typetext/htmlに設定します(リンク先の投稿の説明に従って)。拡張子を持たないようにアップロードする前にシステムのファイルの名前を変更するか、アップロード後にS3で拡張子のない rename にする必要があります。 S3上のファイル名は拡張子を持たない必要があります。

  2. 「クリーン」な名前でフォルダーを作成し、そのフォルダーにページファイルをアップロードします。名前は デフォルトのインデックスドキュメント に設定します。 index.html。デフォルトのインデックスドキュメント名を確認する必要があります。これは、バケットをWebサイトとして設定するときに設定されますが、後で変更できます。

上記の作業を実行できない場合、名前キーmypageで新しいゼロバイトオブジェクトをアップロードし、アップロードプロセス中にメタデータでWebsite Redirect Locationキーに値mypage.htmlを指定してページリダイレクトを設定できます。 Amazon S3ドキュメントのウェブページリダイレクトの設定を参照してください。

Content-Typetext/htmlに設定して、mypageという名前の新しいオブジェクトにファイルをコピーすることもできます。

14
jamtin

既に述べたように、ファイル拡張子を削除しますが、次の手順に従ってください。

  1. Amazon S3バケットに移動します。
  2. 適切にリンクするファイルの横にあるチェックボックスを選択します。
  3. 右側の[プロパティ]をクリックすると、新しいペインが表示されます。 「Object:filename」と表示されます
  4. 「メタデータ」タブをクリックして、デフォルトから変更します。これは、私にとって「binary/octet-stream」でした。新しい値は「text/html」でなければなりません。
  5. セーブ。

そして、人々が言っ​​たように、あなたのhtmlの新しいリンクが.htmlファイル拡張子を含まないようにしてください。これは私のために働いた。

6
BrotherDonkey

/mypageにフォルダーを作成し、その中にindex.htmlを入れてもうまくいきませんでした。これは、バケットの「インデックスドキュメント」設定がmyindex.htmlに変更されたためであることがわかりました。

Bucket Properties --> Static Website Hosting --> Enable Website Hosting --> Index Document

これは実際にはすべてのサブフォルダーにも適用されていたため、/mypage/index.htmlルート上で/mypageを探していませんでした。代わりに/mypage/myindex.htmlを探していました。

myindex.html設定をindex.htmlに戻すだけで、標準のフォルダー構造が機能します。その設定を使用してmyindex.htmlファイルをあらゆる場所で使用することも同様に機能しますが、それは実際の利益のために混乱しているように見えました。

Content-Typetext/htmlに設定してもうまくいかない理由はまだわかりません。

とにかく、バケットのIndex Documentとすべてのサブフォルダーをindex.htmlを使用するように変更することで問題は解決します。

4
Tyler

AWS CLIの場合:

ファイル名から拡張子を削除し、アカウントでAWS CLIをセットアップしたと仮定すると、コンソールで次のコマンドを実行してファイルのメタデータを設定できます。

aws s3 cp /path/to/file s3://yourwebsite.com --content-type 'text/html' --acl public-read
3
captainblack

別の可能な解決策は、Lambda @ Edge powerを使用することです ドキュメントリファレンスはこちら

1
Gianluca Casati

非常にシンプルでテスト済みのソリューション。 :

  1. ファイル名を変更し、ファイル名から拡張子(.html)を削除します。 (例:gallery.htmlをギャラリーに変更します)。
  2. ファイルのプロパティを編集します。メタデータキーを追加します(コンテンツタイプ= text/htmlおよびコンテンツ言語= html)。
  3. Websiteurl.com/galleryのようなブラウザーのURLから保存してテストします。
1
Nirmal Bajpai

コレクションを使用している場合は、追加の/文字の終わりまで

collections:
  my_collection:
   output:true
   permalink: /:collection/:path/
0
Dylan Pierce