2010-02-16 5 views
41

Est-il possible de placer un en-tête de redirection sur un objet s3? Comme une redirection 301.Redirection d'objet Amazon S3

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

vous a été bien une solution idéale pour cela? – Daveo

+1

Cette fonctionnalité vient d'être ajoutée. Voir ma réponse ci-dessous. – Layke

+0

Vous devriez accepter une réponse ici. – Gray

Répondre

33

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

Vous trouverez 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 la clé x-amz-website-redirect-location contre cet objet à la redirection 301 que vous souhaitez utiliser.

Vous pouvez également utiliser la console.

enter image description here

+1

Est-ce que cela fonctionne pour les objets arbitraires? Ou seulement pour leurs trucs spéciaux HTML-static-site? – Matchu

+0

Malheureusement, il n'y a pas de support pour les caractères génériques, donc je ne peux pas faire de redirection pour supprimer le '/ index.html' final sur mon site statique. –

+0

Est-ce que cela fonctionnera si vous utilisez cloudfront avec s3? Cloudfront achemine vers mon site, mais télécharge le fichier au lieu de suivre la règle de redirection que j'ai définie dans s3. – Learner

6

Edit: Voir la réponse ci-dessus cette fonctionnalité est maintenant natif dans AWS

Pas vraiment non. Il n'y a pas de fonctionnalité intégrée qui permette cela, cependant, ce que vous pouvez faire est de créer votre objet et même si vous ne l'enregistrez pas au format HTML, vous pouvez l'appliquer comme un 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: Voir la source sur rapidement.

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

+0

J'ai oublié de mentionner que vous créeriez alors une balise d'en-tête dans le code HTML qui redirige. – Layke

+0

Je préférerais que je puisse rediriger dans l'en-tête avant que le html ne soit chargé. Je sais qu'il est possible de changer les en-têtes pour Content-Type par exemple mais puis-je également définir un en-tête de redirection? Quelque chose comme ceci: HTTP/1.1 301 déplacé de façon permanente Emplacement: http://www.example.org/ Type de contenu: text/html Content-Length: 174 – Martin

+0

Hmm ne savait pas que multilines était désactivé dans les commentaires . Voir la question éditée à la place. – Martin

8

Dans le cas où l'hébergement de site Web est activé pour le seau, il y a une autre façon d'ajouter 301 redirect. Selon cette règle, 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 Static Website Hosting). La documentation complète sur sa syntaxe peut actuellement être trouvée here.

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> 

On dirait qu'il est le même que la création d'objets faux et en spécifiant les métadonnées x-amz-site-redirect-emplacement pour eux. Les mauvaises nouvelles sont qu'il ne devrait pas y avoir plus de 50 de ces règles en XML pour un seul compartiment. Et oui, il n'est pas pratique de gérer XML. Mais pour moi, cette façon est plus facile à l'heure actuelle. Encore une fois, parce qu'il est plus facile de gérer tous les fichiers au même endroit.

Cette XML approche est extrêmement utile lorsque vous, par exemple, un répertoire renommé avec beaucoup de pages. Dans ce cas, il est nécessaire de créer une seule règle de redirection pour le répertoire, au lieu de la 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 vers la page , mais de sauvegarder les paramètres de requête. Il pourrait être approprié s'il y a 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 a simple online tool dans GWT à convertir du texte brut avec des anciennes et nouvelles URL au format XML. Il utilise le prédicat KeyPrefixEquals et exécute la redirection ReplaceKeyPrefixWith.

Enfin, selon documentation, si l'hébergement de site Web est désactivé, la prise en charge de la redirection ne s'applique pas à ce compartiment.

+0

Cette fonctionnalité prend-elle en charge les expressions régulières? : Je veux ajouter ".html" à tous les fichiers qui ne se terminent pas avec une extension de fichier. Par exemple: mysite.com/aaa/xxx doit être redirigé vers -> monsite.com/aaa/xxx.html Je souhaite rediriger tous les * vers .html, mais seulement si le nom du fichier ne se termine pas par une extension de fichier. (Je ne veux pas le faire pour les fichiers js et pas pour les dossiers ...) Cette fonctionnalité prend-elle en charge les expressions régulières? Quelqu'un peut-il poster des exemples avec des expressions régulières? (KeyPrefixEquals^[^.] $ -> ReplaceKeyPrefixWith $ 1.html) – tamirko

+0

Il ne supporte pas les expressions régulières ce qui serait impossible –

2

htaccess 301 à Amazon S3 rediriger la traduction


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 pouvez probablement écrire un petit script le long des lignes 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 redirect à 50.

1

AWSCLI vous permet de faire facilement maintenant (sorte de)

  1. Assurez-vous seau est 100% publique
  2. Marque seau sûr est en mode Hébergement Web
  3. Se référer seulement au site en utilisant son URL complet https://<bucket_name>.s3-website-<region>.amazonaws.com
  4. Utilisez le s3api appel pour régler la redirection

    aws s3api mis objet --acl lire publique --website-redirect-lieu "http://other-location.com" --bucket-seau foo --key quelque part/bla

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

Test avec

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