web-dev-qa-db-ja.com

Amazon S3オブジェクトのリダイレクト

S3オブジェクトにリダイレクトヘッダーを置くことは可能ですか? 301リダイレクトのように。

例えば:

mybucket.Amazon-aws.com/myobject --> example.com/test

できれば、オブジェクトに次のようなヘッダーを設定してください。

HTTP/1.1 301 Moved Permanently
Location: http://example.com/test
Content-Type: text/html
Content-Length: 0
47
Martin

先月、この機能が追加されました。

APIドキュメントは次の場所にあります。

http://docs.amazonwebservices.com/AmazonS3/latest/dev/how-to-page-redirect.html

オブジェクトをPUTするとき、そのオブジェクトに対してx-amz-website-redirect-locationキーを使用する301リダイレクトに設定する必要があります。

コンソールを使用することもできます。

enter image description here

38
Layke

バケットでウェブサイトのホスティングが有効になっている場合、301リダイレクトを追加する別の方法があります。それに応じて、リダイレクトルールはバケットレベルでXML形式で記述され、AWS S3コンソール(静的ウェブサイトホスティングセクション)を介してバケットのプロパティで指定できます。現在、その構文に関する完全なドキュメントは here にあります。

このアプローチは、すべてのリダイレクトを1か所で管理する方が簡単である限り、URLの大規模な移動がある場合に便利です。たとえば、リダイレクトルールを定義することが可能です

<RoutingRule>
    <Condition>
        <KeyPrefixEquals>index.php</KeyPrefixEquals>
    </Condition>
    <Redirect>
        <ReplaceKeyWith>index.html</ReplaceKeyWith>
    </Redirect>
</RoutingRule>
<RoutingRule>
    <Condition>
        <KeyPrefixEquals>blog.php?id=21</KeyPrefixEquals>
    </Condition>
    <Redirect>
        <ReplaceKeyWith>mysql-utf-8-database-creation-snippet.html</ReplaceKeyWith>
    </Redirect>
</RoutingRule>

偽のオブジェクトを作成し、x-amz-website-redirect-locationメタデータを指定するのと同じように見えます。悪いニュースは、1つのバケットのXMLに50を超えるそのようなルールが存在しない可能性があることです。そして、はい、XMLを管理するのは便利ではありません。しかし、私にとって、この方法は現在簡単です。繰り返しますが、すべてのファイルを1か所で管理する方が簡単だからです。

このXMLアプローチは、たとえば、多くのページがあるディレクトリの名前を変更した場合に非常に役立ちます。この場合、ディレクトリ内の各ページに個別のルールを作成するのではなく、ディレクトリに単一のリダイレクトルールを作成する必要があります。例えば

<RoutingRule>
    <Condition>
        <KeyPrefixEquals>blog/</KeyPrefixEquals>
    </Condition>
    <Redirect>
        <ReplaceKeyPrefixWith>it-blog/</ReplaceKeyPrefixWith>
    </Redirect>
</RoutingRule>

このルールに従って、example.com/blog/whateverexample.com/it-blog/whateverにリダイレクトされます。

このようなアプローチのもう1つの便利な機能は、プレフィックスのみを置き換えることです。ディレクトリの場合と同じように、ページをリダイレクトできますが、クエリパラメータは保存します。これらのクエリパラメータのJS処理がある場合に適しています。 x-amz-website-redirect-locationメタデータを使用すると、おそらくそれらが失われます。

前述したように、XMLの書き込みと読み取りは不便かもしれません。これを克服するために、GWTで シンプルなオンラインツール を作成し、以前のURLと新しいURLを含むプレーンテキストをXML形式に変換しました。 KeyPrefixEquals述語を使用して、ReplaceKeyPrefixWithリダイレクトを実行します。

最後に、 documentation によると、ウェブサイトのホスティングが無効になっている場合、このバケットにはリダイレクトのサポートは適用されません。

12

編集:この機能はAWSでネイティブになったため、上記の回答を参照してください

本当にない。これを可能にする組み込み機能はありませんが、できることはオブジェクトを作成することです。HTMLとして保存しない場合でも、HTMLファイルとして適用できます。

例えば:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="Refresh" content="0; URL=http://www.example.com/target/">
    <title>Redirect</title>
</head>

<body>
    <a href="http://www.example.com/target/">http://www.example.com/target/</a>
</body>
</html>

こちらのページをご覧ください。ソースをすばやく表示します。

view-source: http://carltonbale.com.s3.amazonaws.com/distance_chart.png

ここで説明を見ることができます:

ポイント8: http://carltonbale.com/9-hidden-features-of-Amazon-s

7
Layke
7
seva.lapsha

htaccess 301からAmazon S3リダイレクト変換


htaccessスタイル:

Redirect 301 /old/old.html http://www.new.com/new/new.html

に翻訳する:

<RoutingRule>
    <Condition>
        <KeyPrefixEquals>old/old.html</KeyPrefixEquals>
    </Condition>
    <Redirect>
        <HostName>www.new.com</HostName>
        <Protocol>http</Protocol>
        <HttpRedirectCode>301</HttpRedirectCode>
        <ReplaceKeyWith>new/new.html</ReplaceKeyWith>
    </Redirect>
</RoutingRule>

おそらく、次の行に沿って小さなスクリプトを書くことができます。

// -----------------
// Javascript
// htaccess to Amazon s3 redirect for static s3 websites.
// (XML goes into S3 Bucket Properties Editor > [x] Enable website hosting > Edit Redirection Rules box.)
// -----------------

var list = [
    "Redirect 301 /old/old-1.html http://www.new.com/new/new-1.html",
    "Redirect 301 /old/old-2.html http://www.new.com/new/new-2.html",
    "Redirect 301 /old/old-3.html http://www.new.com/new/new-3.html"
];

var output = [];

output.Push('<?xml version="1.0"?>');
output.Push('<RoutingRules>');

for(var i=0; i<list.length; i++){

    var item = list[i].replace("Redirect 301 /", "").split(" ");
    var oldLoc = item[0];
    var newLoc = item[1];

    output.Push("   <RoutingRule>");
    output.Push("       <Condition>");
    output.Push("           <KeyPrefixEquals>" + oldLoc + "/KeyPrefixEquals>");
    output.Push("       </Condition>");

    output.Push("       <Redirect>");
    if(newLoc.substr(0, 1) == "/"){

        output.Push("           <ReplaceKeyWith>" + newLoc + "</ReplaceKeyWith>");

    } else {

        var splitNewLoc = newLoc.replace("http://", "").split("/");
        var Host = splitNewLoc.shift();
        var path = splitNewLoc.join("/");

        output.Push("           <HostName>" + Host + "</HostName>");
        output.Push("           <Protocol>http</Protocol>");
        output.Push("           <HttpRedirectCode>301</HttpRedirectCode>");

        if(path){
            output.Push("           <ReplaceKeyWith>" + path + "</ReplaceKeyWith>");
        }

    }

    output.Push("       </Redirect>");
    output.Push("   </RoutingRule>");

}

output.Push('</RoutingRules>');

print(output.join("\n"));

警告:Amazonはリダイレクトルールの数を50に制限しています。

3
bob

[〜#〜] awscli [〜#〜] これを今すぐ簡単に行うことができます(並べ替え)

  1. バケットが100%パブリックであることを確認してください
  2. バケットがウェブサイトホスティングモードであることを確認してください
  3. 完全なURLを使用しているサイトのみを参照https://<bucket_name>.s3-website-<region>.amazonaws.com
  4. 使用 s3apiリダイレクトを設定するための呼び出し

    aws s3api put-object --acl public-read --website-redirect-location " http://other-location.com " --bucket foo-bucket --key somewhere/blah

:S3にはオブジェクトを投稿しないでください。S3は301のみを提供し、Locationヘッダーをリダイレクトするためです。

でテスト

curl -v 2 -L https://<bucket_name>.s3-website-<region>.amazonaws.com/somewhere/blah

2
Joseph Lust