Por que o local de redirecionamento do site S3 não é seguido pelo CloudFront?

18

Eu tenho um site hospedado no Amazon S3. É a nova versão de um site antigo hospedado no WordPress.

Eu configurei alguns arquivos com os metadados Website Redirect Locationpara lidar com o local antigo e redirecioná-los para as novas páginas do site.

Por exemplo: eu tinha o http://www.mysite.com/solutionque eu quero redirecionar para http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlEntão, criei um arquivo vazio nomeado solutiondentro do meu bucket com os metadados corretos:

Website Redirect Location= /product.html

Os metadados de redirecionamento S3 são equivalentes aos 301 Moved Permanentlyótimos para SEO. Isso funciona muito bem ao acessar o URL diretamente do domínio S3.

Também configurei uma distribuição do CloudFront com base no intervalo do site. E quando tento acessar através da minha distribuição, o redirecionamento não funciona, ou seja:

http://xxxx123.cloudfront.net/solution não redireciona, mas baixa o arquivo vazio.

Então, minha pergunta é como manter o redirecionamento através da distribuição do CloudFront? Ou alguma idéia de como lidar com o redirecionamento sem deteriorar o SEO?

obrigado

Yannick Chaze
fonte

Respostas:

47

Encontrei esse problema recentemente e encontrei uma solução alternativa que parecia funcionar.

Criei uma distribuição do Cloudfront com uma origem personalizada apontando para o nome do host do site estático S3 em vez do nome do host do bucket. No caso do OP, a origem desejada seria.

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

Atingir uma distribuição do Cloudfront apenas usando o bucket como a origem não funciona, porque o bucket na verdade não serve redirecionamentos. Ele serve apenas arquivos e armazena metadados.

Espero que ajude.

bmatsuo
fonte
Observe que o Cloudfront armazena em cache a resposta de redirecionamento em vez de segui-la. Conseqüentemente, downloads de recursos que você redireciona para ignorar o Cloudfront.
tfischbach
2
bmatsuo - Se pudéssemos dar a você um bilhão de pontos de repetição por isso, nós o daríamos. Muito obrigado. Você realmente salvou o dia.
snipe 07/07
Isso ajudou muito! Vale a pena mencionar para quem é novo no S3: para criar um bucket estático, vá para o seu bucket e visite a guia Propriedades. Clique em Hospedagem estática de sites. Isso lhe dará a URL correta, que permitirá o encaminhamento de :)
rick6
2

Análise

De acordo com o comportamento documentado de solicitação e resposta e códigos de status HTTP suportados para origens personalizadas , o Amazon CloudFront não segue os redirecionamentos , infelizmente:

[...] Depois de configurar o redirecionamento, na primeira vez em que um usuário final envia uma solicitação para o objeto, o CloudFront Front envia a solicitação para a origem, e a origem responde com um redirecionamento (por exemplo, 302 movido temporariamente). O CloudFront armazena em cache o redirecionamento e o retorna ao usuário final. O CloudFront não segue o redirecionamento. [ênfase minha]

Obviamente, você está usando o Amazon S3 em vez de uma origem personalizada, e uma seção relacionada está notavelmente ausente do Comportamento de solicitação e resposta para origens do Amazon S3 , mas, como os redirecionamentos do Amazon S3 foram adicionados apenas recentemente, consulte Amazon S3 - Suporte para site Redirecionamentos ), pode estar faltando lá ainda.

Por conseguinte, arrisco a suposição de que você não está recebendo um arquivo vazio com o código de status HTTP 200 OK , e sim um status HTTP 301 Movido permanentemente sem corpo algum - você realmente verificou isso com um navegador ou, eventualmente, apenas com uma ferramenta de linha de comando como por exemplo, cURL ou HTTPie ? As últimas ferramentas geralmente exigem um parâmetro explícito para seguir os redirecionamentos, portanto isso pode passar despercebido facilmente.

Solução potencial

Se a análise estiver correta, você precisará configurar o redirecionamento para segmentar explicitamente o CloudFront. Em seguida, consulte Redirecionamentos :

Você pode configurar seu servidor da Web para redirecionar solicitações para um dos seguintes locais:

  • A nova URL do objeto no servidor de origem. Quando o usuário final segue o redirecionamento para o novo URL, o usuário final ignora o CloudFront e vai direto para a origem. Como resultado, recomendamos que você não redirecione solicitações para o novo URL do objeto na origem.

  • O novo URL do CloudFront para o objeto. Quando o usuário final envia a solicitação que contém o novo URL do CloudFront, o CloudFront obtém o objeto do novo local na sua origem, o armazena em cache no local da borda e retorna o objeto ao usuário final. Solicitações subsequentes para o objeto serão atendidas pelo local da borda. Isso evita a latência e a carga associadas aos visualizadores que solicitam o objeto da origem. No entanto, todas as novas solicitações para o objeto terão cobranças por duas solicitações ao CloudFront.

Steffen Opel
fonte
Quando eu curvo o URL que deve ser redirecionado através da distribuição do CloudFront, eu entendo: HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 Meu entendimento é que o redirecionamento é gerenciado pelo S3 e, nesse caso, o arquivo é hospedado pelo CloudFront e não se importa com os cabeçalhos de redirecionamento definidos para S3 como S3 é o servidor web do arquivo. Não consigo mapear o redirecionamento senão com os metadados.
Yannick Chaze