Перенаправление объекта Amazon S3 - PullRequest
46 голосов
/ 16 февраля 2010

Можно ли поместить заголовок перенаправления на объект 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

Ответы [ 6 ]

38 голосов
/ 22 октября 2012

В течение последнего месяца эта функция была только что добавлена.

Документацию по API можно найти здесь:

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

Когда вы кладете объект, вам нужно установить ключ x-amz-website-redirect-location для этого объекта на 301 перенаправление, которое вы хотите использовать.

Вы также можете использовать консоль.

enter image description here

11 голосов
/ 25 июля 2013

В случае, если хостинг веб-сайтов включен для корзины, есть альтернативный способ добавить 301 перенаправление. В соответствии с этим правила перенаправления описаны на уровне сегмента в XML-формате и могут быть указаны в свойствах сегмента через консоль AWS S3 (раздел «Статический хостинг»). Полная документация о его синтаксисе в настоящее время может быть найдена здесь .

Этот подход удобен, когда у вас большие перемещения 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. Плохая новость заключается в том, что в XML может быть не более 50 таких правил для одного сегмента. И да, управлять XML не удобно. Но для меня этот способ проще в настоящее время. Опять же, потому что проще управлять всеми файлами в одном месте.

Этот XML-подход чрезвычайно полезен, когда вы, скажем, переименовали каталог с большим количеством страниц. В этом случае необходимо создайте одно правило перенаправления для каталога, а не отдельное правило для каждой страницы внутри него. Например

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

Согласно этому правилу example.com/blog/whatever будет перенаправлен на example.com/it-blog/whatever.

Еще одна полезная особенность такого подхода заключается в том, что он заменяет только префиксы. Так же, как и с каталогами, это возможно перенаправить страницу, но сохранить параметры запроса. Это может быть подходящим, если есть некоторая обработка этого запроса JS параметры. С метаданными x-amz-website-redirect-location вы, вероятно, потеряете их.

Как я уже говорил, написание и чтение XML может быть неудобным. Чтобы преодолеть это, я написал простой онлайн-инструмент в GWT, чтобы преобразовать обычный текст с прежними и новыми URL в формат XML. Он использует KeyPrefixEquals предикат и выполнение ReplaceKeyPrefixWith редирект.

Наконец, согласно документации , если хостинг веб-сайтов отключен, поддержка перенаправления не применяется для этого сегмента.

7 голосов
/ 05 октября 2012

Способность была добавлена ​​недавно: http://aws.typepad.com/aws/2012/10/amazon-s3-support-for-website-redirects.html

7 голосов
/ 16 февраля 2010

Редактировать: см. Ответ выше, поскольку эта функция теперь встроена в 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>

Посмотрите на эту страницу здесь: быстро просмотрите источник.

вид-источник: http://carltonbale.com.s3.amazonaws.com/distance_chart.png

Вы можете увидеть объяснение здесь:

Точка 8: http://carltonbale.com/9-hidden-features-of-amazon-s3

3 голосов
/ 04 октября 2014

Перенос htaccess 301 в Amazon S3


Стиль доступа:

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.

2 голосов
/ 01 апреля 2016

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 - ключ где-то / бла

Примечание : Вы не публикуете какой-либо объект на S3, поскольку он будет обслуживать только 301 и перенаправлять заголовок Location.

Тест с

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...