Estou com esse problema do CORS, apesar de definir o servidor (nginx / node.js) com os cabeçalhos apropriados.
Eu posso ver no painel Rede do Chrome -> Cabeçalhos de resposta:
Access-Control-Allow-Origin:http://localhost
o que deve fazer o truque.
Aqui está o código que agora uso para testar:
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log('xhr loaded');
};
xhr.open('GET', 'http://stackoverflow.com/');
xhr.send();
eu recebo
XMLHttpRequest não pode carregar http://stackoverflow.com/ . Origem http: // localhost não é permitido pelo Access-Control-Allow-Origin.
Eu suspeito que é um problema no script do cliente e não na configuração do servidor ...
Respostas:
O Chrome não suporta host local para solicitações do CORS (um bug aberto em 2010, marcado WontFix em 2014).
Para contornar isso, você pode usar um domínio como
lvh.me
(que aponta para 127.0.0.1 como localhost) ou iniciar o chrome com a--disable-web-security
flag (assumindo que você está apenas testando).fonte
Grrrr...
De acordo com a resposta do @ Beau, o Chrome não suporta solicitações CORS do host local e é improvável que haja alguma alteração nessa direção.
Eu uso o Allow-Control-Allow-Origin: * Extensão do Chrome para solucionar esse problema. A extensão adicionará os cabeçalhos HTTP necessários para o CORS:
O código fonte é publicado no Github .
Observe que a extensão filtra todos os URLs por padrão. Isso pode quebrar alguns sites (por exemplo: Dropbox). Alterei-o para filtrar apenas URLs de host local com o seguinte filtro de URL
fonte
Access-Control-Allow-Credentials: true
porque ele defineAccess-Control-Allow-Origin
para*
e com ambastrue
e*
é bloqueada pelos navegadores. Se estiver usando credenciais true, você deve usar a origem não curinga. Eu recomendo o Moesif Origins e o CORS Changer Extension, que permitem alterar os cabeçalhos da maneira que desejar.O verdadeiro problema é que, se definirmos
-Allow-
para todas as solicitações (OPTIONS
&POST
), o Chrome a cancelará. O código a seguir funciona para mimPOST
no LocalHost com Chromefonte
O Chrome fará solicitações com o CORS de uma
localhost
origem muito bem. Este não é um problema com o Chrome.O motivo pelo qual você não pode carregar
http://stackoverflow.com
é que osAccess-Control-Allow-Origin
cabeçalhos não estavam permitindo sualocalhost
origem.fonte
Correção de extensão rápida e suja do Chrome:
Moesif Orign & CORS Changer
No entanto, o Chrome suporta solicitações de origem cruzada do host local. Certifique-se de adicionar um cabeçalho para
Access-Control-Allow-Origin
forlocalhost
.fonte
Nenhuma das extensões funcionou para mim, então instalei um proxy local simples. No meu caso, https://www.npmjs.com/package/local-cors-proxy É uma configuração de 2 minutos:
(do site deles)
Funcionou como um encanto para mim: seu aplicativo chama o proxy, que chama o servidor. Zero problemas de CORS.
fonte
Decidi não tocar nos cabeçalhos e fazer um redirecionamento no lado do servidor e ele funciona como um encanto.
O exemplo abaixo é para a versão atual do Angular (atualmente 9) e provavelmente qualquer outra estrutura usando os DevServer dos webpacks. Mas acho que o mesmo princípio funcionará em outros back-ends.
Então, eu uso a seguinte configuração no arquivo proxy.conf.json :
No caso do Angular, eu sirvo com essa configuração:
Eu prefiro usar o proxy no comando serve, mas você também pode colocar essa configuração em angular.json assim:
Veja também:
https://www.techiediaries.com/fix-cors-with-angular-cli-proxy-configuration/
https://webpack.js.org/configuration/dev-server/#devserverproxy
fonte