Configurando o controle de acesso - permitir origem no Cloudfront

15

Estou tendo problemas para fornecer ativos estáticos ao Firefox usando o AWS Cloudfront.

O Chrome funciona perfeitamente, mas o Firefox está retornando um erro de CORS.

Se eu executar curl, recebo:

HTTP/1.1 200 OK
Content-Type: application/x-font-opentype
Content-Length: 39420
Connection: keep-alive
Date: Mon, 11 Aug 2014 21:53:50 GMT
Cache-Control: public, max-age=31557600
Expires: Sun, 09 Aug 2015 01:28:02 GMT
Last-Modified: Fri, 08 Aug 2014 19:28:05 GMT
ETag: "9df744bdf9372cf4cff87bb3e2d68fc8"
Accept-Ranges: bytes
Server: AmazonS3
Age: 2743
X-Cache: Hit from cloudfront
Via: 1.1 c445b20dfbf3128d810e975e5d84e2cd.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ...

Acho que precisa do cabeçalho:

Access-Control-Allow-Origin: *

Alguém pode me ajudar? Por que é um problema no Firefox e não no Chrome? Como posso resolver isso?

Tony
fonte

Respostas:

18

Primeiro, você precisa garantir que você coloque o cabeçalho da origem na lista de permissões:

Se você deseja que o CloudFront respeite as configurações de compartilhamento de recursos de origem cruzada, configure o CloudFront para encaminhar o cabeçalho de Origem para sua origem.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-cors

Consulte também: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

A propósito, existem várias perguntas semelhantes no serverfault / stackoverflow e muitas respostas.

bjunix
fonte
4

Isso é um pouco mais complicado do que a resposta aceita indica.

O suporte ao CORS ao usar o Cloudfront + S3 é realmente implementado no S3 e funciona assim de acordo com a Amazon:

O cabeçalho Origin da solicitação deve corresponder a um elemento AllowedOrigin.

O método de solicitação (por exemplo, GET ou PUT) ou o cabeçalho Método de solicitação de controle de acesso no caso de uma solicitação OPTIONS de comprovação deve ser um dos elementos AllowedMethod.

Todo cabeçalho listado no cabeçalho da solicitação de controle de acesso da solicitação na solicitação de comprovação deve corresponder a um elemento AllowedHeader.

Isso faz sentido, o que pode não ficar claro é que, se nenhum cabeçalho Origin for enviado pelo cliente, esse processamento não será feito. E estamos usando o Cloudfront na frente que, se você estiver hospedando apenas recursos estáticos, provavelmente o configurou para ignorar todos os cabeçalhos durante o cache. Portanto, se a primeira solicitação para cada arquivo de um nó de borda específico não incluir o cabeçalho Origin, ele armazenará em cache a resposta sem o cabeçalho Access-Control-Allow-Origin.

O resultado é que a primeira solicitação recebida determinará quais cabeçalhos serão retornados para todas as solicitações até que o cache expire.

Existem várias maneiras de corrigir / solucionar isso.

  • Configure o cloudfront para fazer cache condicional com base no cabeçalho "Origem".

Isso funciona bem se você espera apenas algumas ou uma única origem, mas, caso contrário, sua taxa de cache pode ficar muito ruim.

  • Use o Lambda @ edge para definir forçosamente os cabeçalhos, isso pode ser feito apenas uma vez para cada solicitação de origem (S3).

Totalmente flexível, mas adiciona custos indiretos e custos.

  • Faça com que o cloudfront substitua o cabeçalho "Origem" por um valor fictício para cada solicitação.

Isso é realmente útil apenas no caso "Access-Control-Allow-Origin: *" e é um pouco complicado, mas provavelmente é a melhor solução atual ao hospedar ativos estáticos no cloudfront + S3.

Rasmus Larsen
fonte