O erro "blocked by CORS policy" ocorre quando um site carrega recursos do OSS porque a política de mesma origem do navegador permite acesso apenas a recursos com o mesmo protocolo, domínio e porta. Configure as regras de Cross-Origin Resource Sharing (CORS) do OSS para autorizar, com segurança, sites específicos a acessar seus recursos.
Como funciona
A política de mesma origem do navegador permite que uma página acesse apenas recursos com o mesmo protocolo, domínio e porta. Qualquer diferença entre eles torna a requisição cross-origin:
|
Página atual |
Recurso solicitado |
Cross-origin |
Motivo |
|
|
|
Não |
Mesma origem |
|
|
|
Sim |
Protocolo diferente |
|
|
|
Sim |
Domínio diferente |
|
|
|
Sim |
Porta diferente |
Quando uma página da web solicita recursos do OSS, o domínio do OSS difere do domínio da página. O navegador verifica se o OSS permite explicitamente o acesso cross-origin. Se o OSS não tiver uma regra CORS correspondente, o navegador rejeita a requisição e retorna um erro.
Configure as regras CORS do OSS para informar ao navegador quais requisições cross-origin são permitidas. Se uma regra corresponder, o OSS retorna cabeçalhos como Access-Control-Allow-Origin na resposta. O navegador permite que a página da web acesse o recurso somente após receber esses cabeçalhos.
Método de configuração
Acesse a Bucket list e clique no bucket de destino.
-
No painel de navegação à esquerda, escolha , clique em Create Rule e configure os parâmetros da regra CORS conforme necessário.
Origin: Especifique os sites que podem acessar recursos cross-origin, como
https://www.example.com.Allowed Methods: Especifique os métodos HTTP permitidos, como
GET,PUTePOST.Allowed Headers: Especifique os cabeçalhos de requisição permitidos, como
Authorizationex-oss-*.Exposed Headers: Especifique os cabeçalhos de resposta que o JavaScript do frontend pode ler, como
ETag.Cache Timeout (Seconds): Especifique o tempo de cache dos resultados de preflight.
Vary: Origin: Ative esta opção para múltiplas origens ou caracteres curinga a fim de evitar poluição de cache.
Clique em OK para concluir a configuração.
Para descrições detalhadas dos parâmetros, consulte Parameters of CORS rules. Para configurações específicas, confira os exemplos de cenário a seguir.
Exemplos de cenários
Os cenários a seguir mostram como configurar o CORS para diferentes requisitos de negócio.
Carregar recursos de site estático
O site em https://www.example.com precisa carregar imagens, CSS e arquivos JavaScript do OSS.
|
Parâmetro |
Valor |
Descrição |
|
Origin |
|
Permita requisições cross-origin apenas deste site. |
|
Allowed Methods |
|
O método |
|
Allowed Headers |
Deixe em branco |
Esta é uma requisição simples e não aciona o preflight. Portanto, esta configuração não é usada. |
|
Exposed Headers |
|
O |
|
Cache Timeout (Seconds) |
86400 |
Armazene em cache os resultados de preflight por 24 horas para reduzir as requisições de preflight. |
|
Vary: Origin |
Desmarque |
A origem é única e fixa; portanto, o cache de múltiplos domínios não é uma preocupação. |
Fazer upload de arquivos diretamente do frontend
Os usuários fazem upload de avatares, documentos e outros arquivos para o OSS a partir da página da web em https://app.example.com.
|
Parâmetro |
Valor |
Descrição |
|
Origin |
|
Garanta que apenas este aplicativo autorizado possa fazer upload de arquivos. |
|
Allowed Methods |
|
O uso de |
|
Allowed Headers |
|
Assinaturas temporárias (STS ou URLs pré-assinadas) protegem os uploads diretos do frontend. Use |
|
Exposed Headers |
|
O |
|
Cache Timeout (Seconds) |
600 |
As operações de upload são relativamente incomuns. O armazenamento em cache por 10 minutos reduz as requisições de preflight e permite que as alterações de configuração entrem em vigor rapidamente. |
|
Vary: Origin |
Selecione |
Previna a poluição do cache do CDN e prepare o ambiente para uma possível implantação em múltiplos domínios. |
Suporte para múltiplos ambientes
Múltiplos subdomínios para desenvolvimento, testes e produção, como dev.example.com e app.example.com, precisam acessar os mesmos recursos do OSS.
|
Parâmetro |
Valor |
Descrição |
|
Origin |
|
Use o caractere curinga |
|
Allowed Methods |
|
Permita a leitura e o upload de recursos para atender aos requisitos de teste em múltiplos ambientes. |
|
Allowed Headers |
|
No desenvolvimento em múltiplos ambientes, cada ambiente pode introduzir cabeçalhos personalizados diferentes. Use |
|
Exposed Headers |
|
O |
|
Cache Timeout (Seconds) |
3600 |
A duração de cache de uma hora oferece flexibilidade ao alternar e depurar múltiplos ambientes. |
|
Vary: Origin |
Selecione |
Esta opção é obrigatória. Ela instrui o CDN a distinguir o conteúdo armazenado em cache pelo cabeçalho |
Fazer chamadas no estilo de API com autenticação
O aplicativo frontend em https://api.example.com precisa incluir cabeçalhos personalizados, como Authorization, para acessar recursos protegidos do OSS.
|
Parâmetro |
Valor |
Descrição |
|
Origin |
|
Para requisições com informações de autenticação, a origem deve ser um domínio preciso e confiável. |
|
Allowed Methods |
|
Ofereça suporte ao gerenciamento completo do ciclo de vida para leitura, atualização e exclusão de recursos privados. |
|
Allowed Headers |
|
Não use |
|
Exposed Headers |
|
O |
|
Cache Timeout (Seconds) |
600 |
Para requisições autenticadas, uma duração menor do cache de preflight ajuda as alterações na política de segurança a entrar em vigor mais rapidamente. |
|
Vary: Origin |
Selecione |
Instrua o CDN a armazenar em cache, separadamente, as requisições com origens diferentes para evitar conflitos. |
Tipos de requisições CORS
Os navegadores classificam as requisições cross-origin como requisições simples ou requisições de preflight com base em suas características. Os dois tipos exigem configurações CORS ligeiramente diferentes.
Tipo | Condições de acionamento | Configurações CORS necessárias |
Requisição simples | Todas as seguintes condições são atendidas:
| Origem e métodos permitidos |
Requisição de preflight | Qualquer uma das seguintes condições é atendida:
| Origem, métodos permitidos e cabeçalhos permitidos |
Requisições simples
As requisições simples podem ser enviadas diretamente e são processadas da seguinte forma:
O navegador adiciona o cabeçalho
Originà requisição. O cabeçalho contém a origem do recurso, por exemplo,Origin: https://www.example.com.O OSS compara o método HTTP da requisição e o valor do cabeçalho
Origincom a configuração CORS do bucket de destino. Se houver correspondência, o OSS inclui o cabeçalhoAccess-Control-Allow-Originna resposta.O navegador recebe a resposta e verifica se o valor de
Access-Control-Allow-Origincorresponde ao domínio da requisição original. Em caso de correspondência, a requisição é bem-sucedida; caso contrário, ela falha.
Requisições de preflight
Uma requisição de preflight primeiro verifica se o servidor permite a requisição e é processada da seguinte forma:
O navegador envia uma requisição
OPTIONSque inclui o método (Access-Control-Request-Method) e os cabeçalhos (Access-Control-Request-Headers) da requisição principal.O OSS usa a configuração CORS para verificar se o método e os cabeçalhos da requisição são permitidos. Se algum método ou valor de cabeçalho na requisição de preflight não estiver no conjunto de métodos e cabeçalhos permitidos do recurso de destino, a requisição falha e a requisição principal não é enviada.
Após o sucesso do preflight, o navegador executa o mesmo processo de uma requisição simples.
Parâmetros das regras CORS
O OSS verifica as regras de cima para baixo, na ordem em que foram configuradas, e usa a primeira regra correspondente. Após encontrar uma correspondência, o OSS não verifica as regras subsequentes.
Parâmetro | Obrigatório | Descrição |
Origin | Sim | Especifique os sites ou endereços IP que podem acessar os recursos do OSS cross-origin.
|
Allowed Methods | Sim | Especifique os métodos HTTP permitidos.
|
Allowed Headers | Não | Especifique os cabeçalhos HTTP permitidos nas requisições reais. Esta configuração se aplica a requisições de preflight.
|
Exposed Headers | Não | Especifique quais cabeçalhos nas respostas do OSS o JavaScript do frontend pode acessar.
Para obter |
Cache Timeout (Seconds) | Não | Especifique por quanto tempo, em segundos, o navegador armazena em cache um resultado de preflight Durante o período de validade do cache, requisições cross-origin idênticas para o mesmo recurso não geram nova requisição de preflight. |
Vary: Origin | Não | Defina se o cabeçalho Este cabeçalho instrui os CDNs e outros caches intermediários a distinguir as versões em cache pelo cabeçalho Importante Ative esta opção quando a origem tiver múltiplos domínios ou um caractere curinga. A ativação pode reduzir a taxa de acertos do cache do CDN. |
Aplicar em produção
Melhores práticas de segurança
Configure origens precisas: A menos que o bucket seja totalmente público, não defina a origem como
*. Especifique os domínios do site com precisão.Restrinja os métodos permitidos: Exponha apenas os métodos HTTP exigidos pelo seu aplicativo. Para cenários de somente leitura, configure apenas
GETeHEAD.Liste explicitamente os cabeçalhos permitidos: Siga o princípio do menor privilégio. Liste explicitamente os cabeçalhos de requisição necessários sempre que possível e evite usar
*.
Melhores práticas de desempenho
Otimize o cache de preflight: Defina uma duração de cache razoável, como 86400 segundos, para reduzir as requisições de preflight, a latência e os custos de requisição.
Avalie o efeito do Vary: Origin: A ativação desta opção evita a poluição do cache, mas pode reduzir a taxa de acertos do cache do CDN e aumentar os custos de tráfego de volta à origem. Ative-a apenas para múltiplas origens ou caracteres curinga.
Uso com CDN
Se um bucket tem a aceleração de CDN ativada e você o acessar por meio de um nome de domínio acelerado, as requisições cross-origin chegam primeiro a um ponto de presença do CDN. Configure o CORS de uma das seguintes maneiras:
Configure o CORS no CDN: Configure as regras CORS no console do CDN para que o CDN retorne diretamente os cabeçalhos CORS. Para mais informações, consulte Configure cross-origin resource sharing.
Repasse os cabeçalhos CORS da origem: O CDN repassa os cabeçalhos CORS retornados pelo OSS. Nesse caso, configure as regras CORS no OSS.
As configurações de CORS no OSS entram em vigor apenas quando as requisições acessam diretamente o nome de domínio de origem do OSS ou quando o CDN está configurado para repassar os cabeçalhos de resposta da origem.
Limites
É possível configurar até 20 regras CORS por bucket.
Perguntas frequentes
Por que ocorre o erro “No 'Access-Control-Allow-Origin' header is present on the requested resource”?
Este erro geralmente ocorre porque o navegador armazenou em cache uma resposta antiga sem um cabeçalho CORS, ou porque as regras CORS estão configuradas de modo que nenhuma corresponda à requisição. Solucione o problema da seguinte forma:
Limpe o cache do navegador e teste novamente.
Verifique se a origem e os métodos permitidos da regra CORS correspondem à requisição real.
Crie temporariamente uma regra CORS permissiva para solucionar problemas: defina a origem como
*, selecione todos os métodos permitidos, defina os cabeçalhos permitidos como*, defina os cabeçalhos expostos comoETagex-oss-request-id, defina a duração do cache como0e selecione Vary: Origin.-
Se o problema persistir, execute o seguinte comando em um servidor para visualizar os cabeçalhos da requisição cross-origin:
curl -v -H 'Origin: <origin-address>' '<OSS-resource-URL>' -o output.txtSolucione o problema de acordo com a saída:

Se a resposta contiver um cabeçalho cross-origin correspondente à configuração, o cache do navegador pode ser a causa. Pressione Ctrl+F5 para limpar o cache do navegador ou defina a duração do cache como 0.
-
Se a resposta contiver dois cabeçalhos cross-origin ou um cabeçalho que não corresponda à configuração, o OSS pode estar acelerado pelo CDN.
Acesse o CDN console e desative temporariamente a aceleração do CDN para confirmar que não há problemas de cross-origin.
Após a confirmação, configure um cabeçalho de resposta personalizado em para o nome de domínio acelerado pelo CDN.
Se o problema persistir, consulte Common errors and solutions for OSS Cross-Origin Resource Sharing (CORS) para obter mais soluções.
Por que ocorre o erro “The 'Access-Control-Allow-Origin' header has a value '...' that is not equal to the supplied origin”?
O servidor retornou o cabeçalho Access-Control-Allow-Origin, mas seu valor não corresponde ao Origin da requisição atual. Geralmente, isso indica um problema de cache: quando múltiplos domínios de sites acessam o OSS, o navegador ou o CDN podem reter a permissão de acesso para outro site.
Solução: Ative o Vary: Origin na regra CORS ou limpe o cache do navegador e acesse o recurso novamente.
Por que ocorre o erro “The value of the 'Access-Control-Allow-Origin' header must not be the wildcard '*' when credentials mode is 'include'”?
O aplicativo frontend envia uma requisição com credenciais (Access-Control-Allow-Credentials é True), mas a origem está configurada como o caractere curinga *. Por motivos de segurança, os navegadores não permitem origens curinga nesse caso.
Solução:
Se as
Credentialsprecisarem permanecer na requisição, altere a origem de*para um domínio específico, comohttps://example.com, e certifique-se de queAccess-Control-Allow-Credentialsesteja definido comotrueno servidor.Se as
Credentialsnão forem necessárias, definaxhr.withCredentialscomofalseno código do frontend e certifique-se de queAccess-Control-Allow-Credentialsesteja definido comofalseou não seja retornado pelo servidor.
Por que o Access-Control-Allow-Origin no nível de objeto não entra em vigor?
O Access-Control-Allow-Origin no nível de objeto entra em vigor apenas quando nenhuma regra CORS no nível de bucket estiver configurada. Se as regras CORS no nível de bucket estiverem configuradas, o Access-Control-Allow-Origin no nível de objeto será ignorado, independentemente de a requisição corresponder ou não às regras.
Como melhorar o carregamento cross-origin lento a partir do OSS?
A velocidade de carregamento das requisições cross-origin depende do caminho físico de rede entre o cliente e o bucket do OSS, e não do CORS em si. O acesso de longa distância pode ocorrer quando o cliente está em China (Hong Kong) e o bucket está na China continental. Use OSS transfer acceleration para acessar o bucket.