Perché la posizione di reindirizzamento del sito Web S3 non è seguita da CloudFront?


18

Ho un sito Web ospitato su Amazon S3. È la nuova versione di un vecchio sito Web ospitato su WordPress.

Ho impostato alcuni file con i metadati Website Redirect Locationper gestire la posizione precedente e reindirizzarli alle nuove pagine del sito Web.

Ad esempio: avevo il http://www.mysite.com/solutiondesiderio di reindirizzare a http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlQuindi ho creato un file vuoto chiamato solutionall'interno del mio bucket con i metadati corretti:

Website Redirect Location= /product.html

I metadati di reindirizzamento S3 sono equivalenti a 301 Moved Permanentlyquelli ideali per la SEO. Funziona benissimo quando si accede all'URL direttamente dal dominio S3.

Ho anche creato una distribuzione CloudFront basata sul bucket del sito Web. E quando provo ad accedere tramite la mia distribuzione, il reindirizzamento non funziona, ovvero:

http://xxxx123.cloudfront.net/solution non reindirizza ma scarica invece il file vuoto.

Quindi la mia domanda è come mantenere il reindirizzamento attraverso la distribuzione CloudFront? O qualche idea su come gestire il reindirizzamento senza deteriorare la SEO?

Grazie

Risposte:


47

Di recente ho riscontrato questo problema e ho trovato una soluzione alternativa che sembrava funzionare.

Ho creato una distribuzione Cloudfront con un'origine personalizzata che punta al nome host del sito Web statico S3 anziché al nome host bucket. Nel caso del PO, l'origine desiderata sarebbe.

mysite.s3-website-us-east-1.amazonaws.com

Colpire una distribuzione Cloudfront semplicemente usando il bucket come origine non funziona perché il bucket non serve effettivamente i reindirizzamenti. Serve solo file e archivia metadati.

Spero possa aiutare.


Nota che Cloudfront memorizza nella cache la risposta di reindirizzamento invece di seguirla. Di conseguenza, i download delle risorse reindirizzate per bypassare Cloudfront.
tfischbach,

2
bmatsuo - Se potessimo darti un miliardo di punti rep per questo, lo faremmo. Grazie mille. Hai davvero salvato la giornata.
Snipe

Questo ha aiutato molto! Vale la pena menzionare chi è nuovo su S3: per creare un bucket statico, vai al bucket e visita la scheda Proprietà. Fai clic su Hosting di siti Web statici. Questo ti darà l'URL corretto che consentirà l'inoltro :)
rick6

2

Analisi

Secondo il comportamento documentato di richiesta e risposta e codici di stato HTTP supportati per origini personalizzate , Amazon CloudFront non segue i reindirizzamenti , purtroppo:

[...] Dopo aver configurato il reindirizzamento, la prima volta che un utente finale invia una richiesta per l'oggetto, CloudFront Front invia la richiesta all'origine e l'origine risponde con un reindirizzamento (ad esempio, 302 spostato temporaneamente). CloudFront memorizza nella cache il reindirizzamento e lo restituisce all'utente finale. CloudFront non segue il reindirizzamento. [enfasi mia]

Naturalmente, stai utilizzando Amazon S3 piuttosto che un'origine personalizzata e una sezione correlata è in particolare assente dal comportamento di richiesta e risposta per Amazon S3 Origins , ma dati i reindirizzamenti di Amazon S3 sono stati aggiunti solo di recente (vedi Amazon S3 - Supporto per il sito Web Reindirizzamenti ), potrebbe mancare ancora lì.

Di conseguenza, immagino che non stai ricevendo un file vuoto con il codice di stato HTTP 200 OK , piuttosto uno stato HTTP 301 spostato definitivamente senza alcun corpo - hai effettivamente controllato questo con un browser o alla fine solo con uno strumento da riga di comando come ad esempio cURL o HTTPie ? Questi ultimi strumenti di solito richiedono un parametro esplicito per seguire i reindirizzamenti, quindi questo potrebbe facilmente passare inosservato.

Soluzione potenziale

Se l'analisi risulta corretta, dovrai invece configurare il reindirizzamento per targetizzare esplicitamente CloudFront, vedi ancora Reindirizzamenti :

È possibile configurare il server Web per reindirizzare le richieste a una delle seguenti posizioni:

  • Il nuovo URL dell'oggetto sul server di origine. Quando l'utente finale segue il reindirizzamento al nuovo URL, l'utente finale ignora CloudFront e passa direttamente all'origine. Di conseguenza, si consiglia di non reindirizzare le richieste al nuovo URL dell'oggetto sull'origine.

  • Il nuovo URL CloudFront per l'oggetto. Quando l'utente finale invia la richiesta che contiene il nuovo URL CloudFront, CloudFront ottiene l'oggetto dalla nuova posizione sull'origine, lo memorizza nella posizione del bordo e lo restituisce all'utente finale. Le richieste successive per l'oggetto saranno servite dalla posizione del bordo. Ciò evita la latenza e il carico associati ai visualizzatori che richiedono l'oggetto dall'origine. Tuttavia, ogni nuova richiesta per l'oggetto comporta addebiti per due richieste a CloudFront.


Quando cURL l'URL che deve essere reindirizzato tramite la distribuzione CloudFront ottengo: La HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 mia comprensione è che il reindirizzamento è gestito da S3 e in questo caso il file è ospitato da CloudFront e non si preoccupa delle intestazioni di reindirizzamento impostate per S3 come S3 è il web server del file non riesco a mappare il reindirizzamento se non con i metadati.
Yannick Chaze,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.