web-dev-qa-db-fra.com

Redirection d'objet Amazon S3

Est-il possible de mettre un en-tête de redirection sur un objet s3? Comme une redirection 301.

Par exemple:

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

De préférence en définissant un en-tête comme celui-ci sur l'objet:

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

Au cours du dernier mois, cette fonctionnalité vient d'être ajoutée.

Vous pouvez trouver la documentation API ici:

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

Lorsque vous METTEZ votre objet, vous devez définir le x-amz-website-redirect-location touchez cet objet vers la redirection 301 que vous souhaitez utiliser.

Vous pouvez également utiliser la console.

enter image description here

38
Layke

Dans le cas où l'hébergement de sites Web est activé pour le compartiment, il existe un autre moyen d'ajouter la redirection 301. Selon lui, les règles de redirection sont décrites au niveau du compartiment au format XML et peuvent être spécifiées dans les propriétés du compartiment via la console AWS S3 (section Hébergement de site Web statique). Une documentation complète sur sa syntaxe actuellement peut être trouvée ici .

Cette approche est pratique lorsque vous avez des mouvements d'URL massifs dans la mesure où il est plus facile de gérer toutes les redirections en un seul endroit. Par exemple, il est possible de définir des règles de redirection

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

Il semble que c'est la même chose que de créer de faux objets et de spécifier des métadonnées x-amz-website-redirect-location pour eux. La mauvaise nouvelle est qu'il ne peut y avoir plus de 50 règles de ce type en XML pour un compartiment. Et oui, ce n'est pas pratique de gérer XML. Mais pour moi, cette façon de faire est plus facile à l'heure actuelle. Encore une fois, car il est plus facile de gérer tous les fichiers en un seul endroit.

Cette approche XML est extrêmement utile lorsque vous dites, par exemple, renommer un répertoire avec beaucoup de pages. Dans ce cas, il est nécessaire de créer une règle de redirection unique pour le répertoire, au lieu d'une règle distincte pour chaque page à l'intérieur. Par exemple

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

Selon cette règle example.com/blog/whatever sera redirigé vers example.com/it-blog/whatever.

Une autre caractéristique utile d'une telle approche est qu'elle ne remplace que les préfixes. De la même manière qu'avec les répertoires, il est possible de rediriger la page, mais d'enregistrer les paramètres de requête. Cela pourrait convenir s'il existe un traitement JS de ces paramètres de requête. Avec les métadonnées x-amz-website-redirect-location, vous les perdrez probablement.

Comme je l'ai mentionné, l'écriture et la lecture de XML peuvent être gênantes. Pour surmonter cela, j'ai écrit n outil en ligne simple dans GWT pour convertir du texte brut avec des URL anciennes et nouvelles au format XML. Il utilise le prédicat KeyPrefixEquals et exécute la redirection ReplaceKeyPrefixWith.

Enfin, selon documentation , si l'hébergement de sites Web est désactivé, la prise en charge de la redirection n'est pas applicable pour ce compartiment.

12
Dmitriy Sukharev

Modifier: voir la réponse ci-dessus car cette fonctionnalité est désormais native dans AWS

Non, pas vraiment. Il n'y a pas de fonctionnalité intégrée qui permet cela, cependant, ce que vous pouvez faire est de créer votre objet et même si vous ne l'enregistrez pas en HTML, vous pouvez l'appliquer en tant que fichier HTML.

Par exemple:

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

Regardez cette page ici: Affichez rapidement la source.

vue source: http://carltonbale.com.s3.amazonaws.com/distance_chart.png

Vous pouvez voir une explication ici:

Point 8: http://carltonbale.com/9-hidden-features-of-Amazon-s

7
Layke
7
seva.lapsha

traduction de la redirection htaccess 301 vers Amazon S


style htaccess:

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

se traduit par:

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

Vous pourriez probablement écrire un petit script dans le sens 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"));

AVERTISSEMENT: Amazon limite le nombre de règles de redirection à 50.

3
bob

AWSCLI vous permet de le faire facilement maintenant (en quelque sorte)

  1. Assurez-vous que le seau est 100% public
  2. Assurez-vous que le compartiment est en mode d'hébergement de site Web
  3. Se référer uniquement au site en utilisant son URL complète https://<bucket_name>.s3-website-<region>.amazonaws.com
  4. Utilisez le s3api appeler pour définir la redirection

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

Remarque : Vous ne postez aucun objet sur S3, car il ne servira qu'un 301 et redirigera l'en-tête Location.

Testez avec

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

2
Joseph Lust