

# Solução de problemas do CORS
<a name="cors-troubleshooting"></a>

Os tópicos a seguir podem ajudar a solucionar alguns problemas comuns do CORS relacionados ao S3.

**Topics**
+ [403 Erro proibido: o CORS não está habilitado para este bucket.](#cors-not-enabled)
+ [403 Erro proibido: essa solicitação do CORS não é permitida.](#cors-not-enabled)
+ [Cabeçalhos não encontrados na resposta do CORS](#Headers-not-found)
+ [Considerações sobre o CORS nas integrações de proxy do S3](#cors-in-proxy)

## 403 Erro proibido: o CORS não está habilitado para este bucket.
<a name="cors-not-enabled"></a>

O erro `403 Forbidden` a seguir ocorre quando uma solicitação de origem cruzada é enviada ao Amazon S3, mas o CORS não está configurado no bucket do S3. 

 Erro: HTTP/1.1 403 Resposta proibida do CORS: o CORS não está habilitado para esse bucket. 

A configuração do CORS é um documento ou uma política com regras que identificam as origens que você permitirá que acessem o bucket, as operações (métodos HTTP) compatíveis com cada origem e outras informações específicas da operação. Veja como [configurar o CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html) no S3 usando o console do Amazon S3, AWS SDKs e a API REST. Para ter mais informações sobre o CORS e exemplos da configuração correspondente, consulte [Elementos do CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html#cors-example-1).

## 403 Erro proibido: essa solicitação do CORS não é permitida.
<a name="cors-not-enabled"></a>

O erro `403 Forbidden` a seguir é recebido quando uma regra do CORS na configuração correspondente não coincide com os dados da sua solicitação.

Erro: HTTP/1.1 403 Resposta proibida do CORS: essa solicitação do CORS não é permitida.

Como resultado, esse erro `403 Forbidden` pode ocorrer por vários motivos:
+ A origem não é permitida.
+ Métodos não são permitidos.
+ Cabeçalhos solicitados não são permitidos.

Para cada solicitação que o Amazon S3 recebe, é necessário ter uma regra do CORS na configuração correspondente que coincida com os dados na solicitação. 

### A origem não é permitida
<a name="Origin-not-allowed"></a>

 O cabeçalho `Origin` em uma solicitação do CORS para seu bucket deve corresponder às origens do elemento `AllowedOrigins` na configuração do CORS. Um caractere curinga (`"*"`) no elemento `AllowedOrigins` corresponderia a todos os métodos HTTP. Para ter mais informações sobre como atualizar o elemento `AllowedOrigins`, consulte [Configurar o compartilhamento de recursos de origem cruzada (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html).

 Por exemplo, se somente o domínio `http://www.example1.com` estiver incluído no elemento `AllowedOrigins`, uma solicitação do CORS enviada do domínio `http://www.example2.com` receberá o erro `403 Forbidden`. 

O exemplo a seguir mostra parte de uma configuração do CORS que inclui o domínio `http://www.example1.com` no elemento `AllowedOrigins`. 

```
"AllowedOrigins":[
   "http://www.example1.com"
]
```

Para que uma solicitação do CORS enviada do domínio `http://www.example2.com` seja bem-sucedida, o domínio `http://www.example2.com` deve ser incluído no elemento `AllowedOrigins` da configuração do CORS. 

```
"AllowedOrigins":[
   "http://www.example1.com"
   "http://www.example2.com"
]
```

### Métodos não são permitidos
<a name="Methods-not-allowed"></a>

 Os métodos HTTP especificados no `Access-Control-Request-Method` em uma solicitação de CORS para o bucket devem corresponder ao método ou aos métodos listados no elemento `AllowedMethods` na configuração de CORS. Um caractere curinga (`"*"`) em `AllowedMethods` corresponderia a todos os métodos HTTP. Para ter mais informações sobre como atualizar o elemento `AllowedOrigins`, consulte [Configurar o compartilhamento de recursos de origem cruzada (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html). 

Na configuração do CORS, é possível especificar os seguintes métodos para o elemento `AllowedMethods`:
+ `GET`
+ `PUT`
+ `POST`
+ `DELETE`
+ `HEAD`

O exemplo a seguir mostra parte de uma configuração do CORS que inclui o método `GET` no elemento `AllowedMethods`. Somente solicitações que incluíssem o método `GET` seriam bem-sucedidas. 

```
"AllowedMethods":[
   "GET"
]
```

 Se um método HTTP (por exemplo, `PUT`) fosse usado em uma solicitação do CORS ou incluído em uma solicitação de pré-processamento do CORS no bucket, mas o método não estivesse presente na configuração do CORS, a solicitação geraria um erro `403 Forbidden`. Para permitir essa solicitação do CORS ou a solicitação de pré-processamento do CORS, o método `PUT` deve ser adicionado à sua configuração do CORS. 

```
"AllowedMethods":[
   "GET"
   "PUT"
]
```

### Cabeçalhos solicitados não são permitidos
<a name="Headers-not-allowed"></a>

 Os cabeçalhos listados no cabeçalho `Access-Control-Request-Headers` em uma solicitação de pré-processamento devem corresponder aos cabeçalhos no elemento `AllowedHeaders` na configuração do CORS. Para ver uma lista de cabeçalhos comuns que podem ser usados em solicitações ao Amazon S3, consulte [Common Request Headers](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html). Para ter mais informações sobre como atualizar o elemento `AllowedHeaders`, consulte [Configurar o compartilhamento de recursos de origem cruzada (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html). 

O exemplo a seguir mostra parte de uma configuração do CORS que inclui o cabeçalho `Authorization` no elemento `AllowedHeaders`. Somente solicitações para o cabeçalho `Authorization` seriam bem-sucedidas. 

```
"AllowedHeaders":  [
    "Authorization"
]
```

 Se um cabeçalho, por exemplo, `Content-MD5`, fosse incluído em uma solicitação do CORS, mas o cabeçalho não estivesse presente na configuração correspondente, a solicitação geraria um erro `403 Forbidden`. Para permitir essa solicitação do CORS, o cabeçalho `Content-MD5` deve ser adicionado à sua configuração do CORS. Se você quiser transmitir os cabeçalhos `Authorization` e `Content-MD5` em uma solicitação do CORS para o bucket, confirme se os dois cabeçalhos estão incluídos no elemento `AllowedHeaders` em sua configuração do CORS. 

```
"AllowedHeaders":  [
    "Authorization"
    "Content-MD5"
]
```

## Cabeçalhos não encontrados na resposta do CORS
<a name="Headers-not-found"></a>

 O elemento `ExposeHeaders` na configuração do CORS identifica quais cabeçalhos de resposta você gostaria de tornar acessíveis aos scripts e às aplicações executados em navegadores, em resposta a uma solicitação do CORS.

Se os objetos armazenados no bucket do S3 tiverem metadados definidos pelo usuário (por exemplo, `x-amz-meta-custom-header`) além dos dados de resposta, esse cabeçalho personalizado poderá conter metadados ou informações adicionais a serem acessados do código JavaScript do lado do cliente. No entanto, por padrão, os navegadores bloqueiam o acesso a cabeçalhos personalizados por motivos de segurança. Para permitir que o JavaScript do lado do cliente acesse cabeçalhos personalizados, é necessário incluir o cabeçalho na configuração do CORS.

 No exemplo abaixo, o cabeçalho `x-amz-meta-custom-header1` está incluído no elemento `ExposeHeaders`. O `x-amz-meta-custom-header2` não está incluído no elemento `ExposeHeaders` e não está presente na configuração do CORS. Na resposta, somente os valores incluídos no elemento `ExposeHeaders` seriam exibidos. Se a solicitação incluísse o cabeçalho `x-amz-meta-custom-header2` no cabeçalho `Access-Control-Expose-Headers`, a resposta ainda exibiria `200 OK`. No entanto, somente o cabeçalho permitido, por exemplo, `x-amz-meta-custom-header`, seria exibido na resposta. 

```
"ExposeHeaders":  [
    "x-amz-meta-custom-header1"
]
```

 Para garantir que todos os cabeçalhos apareçam na resposta, adicione todos os cabeçalhos permitidos ao elemento `ExposeHeaders` na configuração do CORS, conforme mostrado abaixo. 

```
"ExposeHeaders":  [
    "x-amz-meta-custom-header1",
    "x-amz-meta-custom-header2"
]
```

## Considerações sobre o CORS nas integrações de proxy do S3
<a name="cors-in-proxy"></a>

Se você estiver enfrentando erros e já tiver conferido a configuração do CORS no bucket do S3, e a solicitação de origem cruzada for enviada para proxies, como o AWS CloudFront, tente o seguinte:
+ Defina as configurações para permitir o método `OPTIONS` para solicitações HTTP.
+ Configure o proxy para encaminhar os seguintes cabeçalhos: `Origin`, `Access-Control-Request-Headers` e `Access-Control-Request-Method`.
+ Configure as definições de proxy para incluir o cabeçalho de origem na chave de cache. Isso é importante porque os proxies de armazenamento em cache que não incluem o cabeçalho de origem na respectiva chave de cache podem fornecer respostas em cache que não incluem os cabeçalhos de CORS apropriados para origens diferentes.

Alguns proxies fornecem recursos predefinidos para solicitações do CORS. Por exemplo, no CloudFront, você pode configurar uma política que inclua os cabeçalhos 

 que permitem solicitações de compartilhamento de recursos entre origens (CORS) quando a origem é um bucket do Amazon S3.

 Essa política tem as seguintes configurações: 
+ Cabeçalhos incluídos nas solicitações de origem:

   `Origin`

   `Access-Control-Request-Headers`

   `Access-Control-Request-Method`
+ Cookies incluídos nas solicitações de origem: nenhum
+ Strings de consulta incluídas em solicitações de origem: nenhuma

Para ter mais informações, consulte [Controlar as solicitações de origem com uma política](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.htm) ou [Usar políticas de solicitação de origem gerenciadas](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#managed-origin-request-policy-cors-s3) no *Guia do desenvolvedor do CloudFront*. 