Solicitação do CORS do Firefox dando ‘Solicitação de origem cruzada bloqueada’, apesar dos headers

Estou tentando fazer uma solicitação de origem cruzada simples e o Firefox está bloqueando-a consistentemente com esse erro:

Solicitação de origem cruzada bloqueada: a política de mesma origem não permite a leitura do recurso remoto em [url]. Isso pode ser corrigido movendo o recurso para o mesmo domínio ou ativando o CORS. [url]

Funciona bem no Chrome e no Safari.

Tanto quanto eu posso dizer que eu coloquei todos os headers corretos no meu PHP para permitir que isso funcione. Aqui está o que meu servidor está respondendo com

HTTP/1.1 200 OK Date: Mon, 23 Jun 2014 17:15:20 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.4-14+deb7u8 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Request-Headers: X-Requested-With, accept, content-type Vary: Accept-Encoding Content-Length: 186 Content-Type: text/html 

Eu tentei usar Angular, JQuery e um object XMLHTTPRequest básico, da seguinte forma:

 var data = "id=1234" var request = new XMLHttpRequest({mozSystem: true}) request.onload = onSuccess; request.open('GET', 'https://myurl.com' + '?' + data, true) request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') request.send() 

… e funciona em tudo que não é o Firefox. Alguém pode ajudar com isso?

Acontece que isso não tem nada a ver com o CORS – foi um problema com o certificado de segurança. Erros enganosos = 4 horas de dores de cabeça.

Descobri que meu problema era: que o servidor para o qual eu enviei a solicitação cruzada tinha um certificado que não era confiável.

Se você deseja se conectar a um domínio cruzado com https (firefox), primeiro adicione a exceção para este certificado.

Você pode fazer isso, visite o link bloqueado uma vez e adicione a exceção.

Espero que isso ajude alguém!

Eu encontrei solução depois de 2 dias :(.

Nota importante: ao responder a uma solicitação credenciada, o servidor deve especificar um domínio e não pode usar o uso de wild carding.

https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

Apenas uma palavra de avisos. Eu finalmente contornei o problema com o Firefox e o CORS.

A solução pra mim foi esse post

Configurando o CORS (compartilhamento de resources de origem cruzada) no Apache com headers de resposta corretos, permitindo que tudo | Benjamin Horn

No entanto, o Firefox estava se comportando muito, muito estranho depois de configurar esses headers no servidor Apache (na pasta .htaccess).

Eu adicionei um monte de console.log("Hi FF, you are here A") etc para ver o que estava acontecendo.

No começo, parecia que estava pendurado em xhr.send() . Mas então eu descobri que não chegou a esta declaração. Eu coloquei outro console.log bem antes dele e não cheguei lá – apesar de não haver nada entre o último console.log e o novo. Apenas parou entre dois console.log .

Reordenando linhas, excluindo, para ver se havia algum caractere estranho no arquivo. Eu não encontrei nada.

Reiniciar o Firefox resolveu o problema.

Sim, eu deveria registrar um bug. É só que é tão estranho, então não sei como reproduzi-lo.

AVISO : E, oh, eu acabei de fazer o Header always set partes, não a parte de Rewrite* !

Basta adicionar

  Header set Access-Control-Allow-Origin "*"  

para o arquivo .htaccess na raiz do site com o qual você está tentando se conectar.

Tente isso, isso deve resolver seu problema

  1. Em seu config.php, adicione www pre em seu domain.com. Por exemplo:

     HTTP define('HTTP_SERVER', 'http://domain name with www/'); HTTPS define('HTTPS_SERVER', 'http://domain name with www/'); 
  2. Adicione isto ao seu arquivo .htaccess

     RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] 

Para mim, eu estava configurando Access-Control-Allow-Origin para um host.com específico (e correto), mas tinha que ser http://host.com . O que o firefox faz? Ele silenciosamente engole a solicitação GET e retorna um status 0 para o XHR, sem nenhum aviso de saída para o console javascript, enquanto que para outras falhas semelhantes, pelo menos, diria algo. Ai ai.

Parece ser um bug no Firefox 44 que foi corrigido na versão 45.

Os arquivos são auto-explicativos. Faça um arquivo, chame de qualquer coisa. No meu caso jq2.php.

         

Agora vamos include um mecanismo, criar um arquivo, chamá-lo como quiser. No meu caso é gs.php.

 $head = "https://maps.googleapis.com/maps/api/place/textsearch/json?query="; //our head $key = "your key here"; //your key $hay = $_GET['needle']; $hay = str_replace(" ", "+", $hay); //replacing the " " with "+" to design it as per the google's requirement $kill = $head . $hay . "&key=" . $key; //assembling the string in proper way . print file_get_contents($kill); 

Eu tentei manter o exemplo o mais simples possível. E como ele executa o link em cada pressionamento de tecla, a cota da sua API será consumida rapidamente.

É claro que não há fim para as coisas que podemos fazer, como colocar os dados em uma tabela, enviar para o database e assim por diante.