2010-02-16 25 views
41

È possibile inserire un'intestazione di reindirizzamento su un oggetto s3? Come un reindirizzamento 301.Reindirizzamento di oggetti Amazon S3

Ad esempio:

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

Preferibilmente impostando un'intestazione simile sull'oggetto:

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

Ti è bene una soluzione ideale a questo? – Daveo

+1

Questa funzionalità è stata appena aggiunta. Vedi la mia risposta qui sotto. – Layke

+0

Dovresti accettare una risposta qui. – Gray

risposta

33

Nell 'ultimo mese, questo la funzionalità è stata appena aggiunta.

È possibile trovare la documentazione API qui:

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

quando si mette l'oggetto, è necessario impostare la chiave x-amz-website-redirect-location contro quell'oggetto al redirect 301 che si desidera utilizzare.

È anche possibile utilizzare la console.

enter image description here

+1

Funziona con oggetti arbitrari? O solo per il loro speciale sito HTML-statico? – Matchu

+0

Sfortunatamente non c'è supporto per i caratteri jolly, quindi non posso effettuare un reindirizzamento per rimuovere il file '/ index.html' sul mio sito statico. –

+0

Funzionerà se si utilizza il cloudfront con s3? Cloudfront sta effettuando il routing sul mio sito, ma successivamente sta scaricando il file anziché seguire la regola di reindirizzamento che ho definito in s3. – Learner

6

Edit: Vedere rispondere sopra, poiché questa funzionalità è ora nativo AWS

Non proprio no. Non c'è una funzione incorporata che permetta questo, tuttavia, ciò che puoi fare è creare il tuo oggetto e anche se non lo salvi come HTML, puoi applicarlo come un file HTML.

Ad esempio:

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

un'occhiata a questa pagina qui: visualizzare l'origine su di esso rapidamente.

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

Si può vedere una spiegazione qui:

Punto 8: http://carltonbale.com/9-hidden-features-of-amazon-s3

+0

Ho dimenticato di menzionare che in realtà in questo caso si creerà un tag di intestazione nell'HTML che reindirizza. – Layke

+0

Preferirei se potessi reindirizzare l'intestazione prima che l'html sia caricato. So che è possibile modificare le intestazioni per Content-Type, ad esempio, ma posso anche impostare un'intestazione di reindirizzamento? Qualcosa del genere: HTTP/1.1 301 spostati in modo permanente Ubicazione: http://www.example.org/ Content-Type: text/html Content-Length: 174 – Martin

+0

Hmm non sapeva che i multilinea erano disabilitati nei commenti . Vedi invece la domanda modificata. – Martin

8

Nel caso in cui il sito web hosting è abilitato per il secchio, v'è un modo alternativo per aggiungere 301 reindirizzamento. In base a ciò le regole di reindirizzamento sono descritte a livello di bucket in formato XML e possono essere specificate nelle proprietà di bucket tramite AWS S3 Console (sezione Static Website Hosting). Attualmente è disponibile la documentazione completa sulla sua sintassi here.

Questo approccio è utile quando si hanno enormi movimenti di URL per quanto è più facile gestire tutti i reindirizzamenti in un unico punto. Per esempio è possibile definire regole di reindirizzamento

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

Sembra che sia lo stesso di creazione di oggetti falsi e specificando x-AMZ-sito-reindirizzamento-location metadati per loro. Le cattive notizie sono che non ci possono essere più di 50 regole di questo tipo in XML per un bucket. E sì, non è conveniente gestire XML. Ma per me in questo modo è più facile al momento. Ancora una volta, perché è più facile gestire tutti i file in un unico posto.

Questo approccio XML è estremamente utile quando, per esempio, viene rinominata una directory con molte pagine. In questo caso è necessario creare una singola regola di reindirizzamento per la directory, anziché una regola separata per ogni pagina al suo interno. Per esempio

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

Secondo questa regola example.com/blog/whatever verrà reindirizzato a example.com/it-blog/whatever.

Un'altra utile caratteristica di tale approccio è che sostituisce solo prefissi. Allo stesso modo delle directory è possibile reindirizzare la pagina, ma salvare i parametri di ricerca. Potrebbe essere adatto se c'è qualche elaborazione JS di questi parametri di query . Con i metadati di x-amz-website-redirect-location probabilmente li perderai.

Come ho già detto, scrivere e leggere XML potrebbe essere sconveniente. Per superare questo ho scritto a simple online tool in GWT a convertire testo semplice con ex e nuovi URL in formato XML. Utilizza il predicato KeyPrefixEquals ed esegue il reindirizzamento ReplaceKeyPrefixWith.

Infine, in base a documentation, se l'hosting del sito Web è disabilitato, il supporto per il reindirizzamento non è applicabile per questo bucket.

+0

Questa funzione supporta le espressioni regolari? : Desidero aggiungere ".html" a tutti i file che non terminano con un'estensione di file. Ad esempio: mysite.com/aaa/xxx deve essere reindirizzato a -> mysite.com/aaa/xxx.html Voglio reindirizzare ogni * a .html, ma solo se il nome del file non termina con un'estensione di file. (Non voglio farlo per i file js e non per le cartelle ...) Questa funzione supporta le espressioni regolari? Qualcuno può pubblicare esempi con espressioni regolari? (KeyPrefixEquals^[^.] $ -> ReplaceKeyPrefixWith $ 1.html) – tamirko

+0

Non supporta le espressioni regolari in modo che sarebbe impossibile –

2

.htaccess 301 per Amazon S3 reindirizzare traduzione


.htaccess stile:

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

si traduce in:

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

probabilmente si potrebbe scrivere un piccolo script lungo le linee di:

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

ATTENZIONE: Amazon limita il numero di regole di reindirizzamento a 50.

1

AWSCLI ti permette di fare questo facilmente ora (specie di)

  1. Assicurarsi secchio è al 100% pubblica
  2. Marchio il secchio sicuro è in modalità di hosting del sito web
  3. Solo fare riferimento al sito utilizzando l'URL completo https://<bucket_name>.s3-website-<region>.amazonaws.com
  4. Utilizzare il s3api chiamata per impostare il reindirizzamento

    AWS s3api put-oggetto --acl --website-reindirizzamento-luogo pubblico-leggere "http://other-location.com" foo-bucket --bucket --key qualche parte/bla

Nota: non si pubblica alcun oggetto su S3, perché verrà pubblicato solo 301 e reindirizzare l'intestazione Location.

di prova con

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