Pergunta

É possível colocar um cabeçalho de redirecionamento em um objeto S3? Como um redirecionamento 301.

Por exemplo:

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

De preferência, definindo um cabeçalho como este no objeto:

HTTP/1.1 301 Moved Permanently
Location: http://example.com/test
Content-Type: text/html
Content-Length: 0
Foi útil?

Solução

No último mês, essa funcionalidade acaba de ser adicionada.

Você pode encontrar a documentação da API aqui:

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

Quando você coloca seu objeto, você precisa definir o x-amz-website-redirect-location Chave contra esse objeto para o redirecionamento 301 que você deseja usar.

Você também pode usar o console.

enter image description here

Outras dicas

Caso se a hospedagem de sites estiver ativada para o balde, há uma maneira alternativa de adicionar 301 redirecionamento. De acordo com as regras de redirecionamento de TI, são descritas no nível do balde no formato XML e podem ser especificadas nas propriedades do Bucket via AWS S3 Console (seção de hospedagem de sites estáticos). A documentação completa sobre sua sintaxe atualmente pode ser encontrada aqui.

Essa abordagem é conveniente quando você tem movimentos enormes de URL, na medida do mais fácil de gerenciar todos os redirecionamentos em um só lugar. Por exemplo, é possível definir regras de redirecionamento

<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>

Parece que é o mesmo que criar objetos falsos e especificar metadados X-AMZ-Website-Redirect-Location para eles. As más notícias são que existem não mais de 50 regras dessas regras em XML para um balde. E sim, não é conveniente gerenciar XML. Mas para mim assim é mais fácil no momento. Novamente, porque é mais fácil gerenciar todos os arquivos em um só lugar.

Essa abordagem XML é extremamente útil quando você, digamos, renomeou um diretório com muitas páginas. Nesse caso, é necessário criar uma única regra de redirecionamento para diretório, em vez de regra separada para cada página dentro dela. Por exemplo

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

De acordo com esta regra example.com/blog/whatever será redirecionado para example.com/it-blog/whatever.

Outra característica útil dessa abordagem é que ela substitui apenas prefixos. Da mesma maneira que nos diretórios, é possível redirecionar a página, mas salve os parâmetros de consulta. Pode ser adequado se houver algum processamento JS desses parâmetros de consulta. Com os metadados X-AMZ-Website-Redirect-Location, você provavelmente os perderá.

Como mencionei, escrever e ler XML pode ser inconveniente. Para superar isso, escrevi Uma ferramenta online simples no GWT para converter texto simples com URLs antigos e novos em formato XML. Ele usa oKeyPrefixEquals predicar e executar ReplaceKeyPrefixWith redirecionar.

Finalmente, de acordo com documentação, Se a hospedagem de sites estiver desativada, o suporte a redirecionamento não será aplicável a este balde.

Editar: veja a resposta acima, pois essa funcionalidade agora é nativa na AWS

Não, realmente não. Não há um recurso embutido que permita isso, no entanto, o que você pode fazer é criar seu objeto e, mesmo que você não o salve como HTML, você pode aplicá -lo como um arquivo HTML.

Por exemplo:

<!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>

Veja esta página aqui: Veja a fonte rapidamente.

View-Source:http://carltonbale.com.s3.amazonaws.com/distance_chart.png

Você pode ver uma explicação aqui:

Ponto 8: http://carltonbale.com/9-hdend-features-of-amazon-s3

HTACCESS 301 para a Amazon S3 Redirect Tradução


estilo htaccess:

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

traduz para:

<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>

Você provavelmente poderia escrever um pequeno script na linha de:

// -----------------
// 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"));

AVISO: A Amazon limita o número de regras de redirecionamento a 50.

Awscli Permite fazer isso facilmente agora (mais ou menos)

  1. Verifique se o balde é 100% público
  2. Verifique se o Bucket está no modo de hospedagem de sites
  3. Consulte apenas o site usando seu URL completo https://<bucket_name>.s3-website-<region>.amazonaws.com
  4. Use o s3api Ligue para definir o redirecionamento

    AWS S3API Put-Object --ACL Public-Read-Website-Redirect-Location "http://other-location.com"-Bucket foo-bucket --key em algum lugar/blá

Observação: Você não posta nenhum objeto para S3, porque ele servirá apenas um 301 e redirecionará Location cabeçalho.

Teste com

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top