Firefox 'Solicitud de origen cruzado bloqueada' a pesar de los encabezados

119

Estoy tratando de hacer una solicitud simple de origen cruzado, y Firefox la bloquea constantemente con este error:

Solicitud de origen cruzado bloqueada: la política de mismo origen no permite leer el recurso remoto en [url]. Esto se puede solucionar moviendo el recurso al mismo dominio o habilitando CORS. [url]

Funciona bien en Chrome y Safari.

Por lo que puedo decir, he configurado todos los encabezados correctos en mi PHP para permitir que esto funcione. Esto es lo que responde mi servidor

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

Intenté usar Angular, jQuery y un objeto XMLHTTPRequest básico, así:

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()

... y funciona en todos los navegadores excepto Firefox. ¿Alguien puede ayudarme con esto?

Godwhacker
fuente
¿Puede proporcionar un seguimiento completo de todas las solicitudes y respuestas? ¿O proporcionar un sitio de prueba al menos? Si el sitio web que accede al origen remoto http, https, archivo? mozSystemno es compatible con sitios web normales que solo empaquetan aplicaciones de firefox-os , así que elimine esa opción.
nmaier
1
@nmaier Headers al enviar como POST en lugar de GET: Accept application/json, text/plain, */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 35 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host [url] Origin [url] Referer [referrer url] User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0 Error: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [url]. This can be fixed by moving the resource to the same domain or enabling CORS. [url]
Godwhacker
2
@nmaier En realidad, parece que se trata de algún tipo de problema con el certificado de seguridad del sitio al que estoy accediendo. Firefox solo está dando un error falso. Si agrego el sitio a la lista de excepciones, funciona bien.
Godwhacker

Respuestas:

121

Resulta que esto no tiene nada que ver con CORS, fue un problema con el certificado de seguridad. Errores engañosos = 4 horas de dolores de cabeza.

Godwhacker
fuente
3
Acabo de tener este problema exacto, el error es demasiado genérico y, además, Chrome y Firefox usan diferentes almacenes de certificados, por lo que es más difícil de depurar. Debería haber sospechado que cuando mi proxy no capturó ninguna solicitud de OPCIONES (se estaba rompiendo en el protocolo de enlace SSL).
Daniel Correia
4
Godwhacker, quizás tengo el mismo problema. ¿Cómo supiste que era el certificado de seguridad? ¿Dónde puedes ver esto?
Leo
9
En mi caso, tenía una aplicación angular que hacía llamadas a otro servidor, y ambos usaban certificados firmados internamente. Sin embargo, Firefox no confía automáticamente en el certificado porque no está reconocido por una autoridad pública. Así que necesitaba asegurarme de que los certificados para ambos servidores se agregaran como excepciones en Firefox antes de que este problema desapareciera.
Sam Storie
3
Para mí, la solución fue establecer withCredentials=trueen la instancia XHR; de lo contrario, Firefox no pudo usar el certificado del cliente al realizar la solicitud (sin embargo, funcionó bien en Chrome).
Clint Harris
1
El comentario de @SamStorie suena más a una respuesta que a esta respuesta. Gracias
Naga
26

Descubrí que mi problema era que el servidor al que le envié la solicitud cruzada tenía un certificado que no era de confianza.

Si desea conectarse a un dominio cruzado con https, primero debe agregar una excepción para este certificado.

Puede hacer esto visitando el enlace bloqueado una vez y agregando la excepción.

Cracker0dks
fuente
5
Eso no ayuda particularmente a nadie que visite su sitio, a menos que esté contento de poner un mensaje allí que diga 'Si está usando Firefox, vaya a este sitio y agréguelo a su lista de excepciones'
Godwhacker
@ Cracker0dks "visite el enlace bloqueado una vez y agregue la excepción" ¿podría explicar dónde agregar la excepción? Estoy usando Firefox Quantum. TIA
Paul
1
navega hasta el enlace del que se queja Firefox directamente. Entonces obtienes la advertencia del certificado. Permitir el certificado. Visite su sitio principal nuevamente.
Cracker0dks
26

Encontré esta pregunta después de haber encontrado solicitudes en Firefox que estaban siendo bloqueadas con el mensaje:

Motivo: la solicitud CORS no se realizó correctamente

Después de tirarme de los pelos, descubrí que una extensión de Firefox recién instalada, Privacy Badger, estaba bloqueando las solicitudes.

Si llega a esta pregunta después de rascarse la cabeza, intente verificar qué extensiones ha instalado para ver si alguna de ellas está bloqueando las solicitudes.

Consulte Razón: la solicitud CORS no se realizó correctamente en MDN para obtener más detalles.

Profesor de programación
fuente
¿Cómo averiguaste qué extensión bloquea las solicitudes? Tengo el mismo problema, ya que la solicitud se realiza correctamente en un Firefox con un nuevo perfil (por lo que no hay extensiones)
Ciprian Tomoiagă
1
Hice clic en cada extensión para ver si había alguna mención de bloqueo de contenido para el sitio en particular con el que estaba teniendo un problema. Ghostery tenía una entrada, así que marqué el sitio como de confianza, recargué la página y las solicitudes tuvieron éxito.
Profesor de programación
1
¡Gracias! También descubrí la extensión Project Insight, que ofrece una descripción general de los permisos de todas las extensiones. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă
1
@awendt Oof. Privacy Badger para mí también. Gracias.
Jason Leach
12

Si no tiene un certificado 'real' (y por lo tanto usa uno autofirmado), en FireFox puede ir a:

Options > Privacy & Security > (scroll to the bottom) View Certificates > Add Exception.

Allí, complete la ubicación, por ejemplo: https: //wwww.myserver: myport

Hypenate
fuente
esto funcionó para mí cuando mi CORS funciona en todos los demás navegadores excepto Firefox con el error -> Solicitud de origen cruzado bloqueada: la Política de mismo origen no permite leer el recurso remoto en localhost: 44304 / v1 / search . (Razón: la solicitud CORS no se realizó correctamente).
JGilmartin
5

Solo unas palabras de advertencia. Finalmente resolví el problema con Firefox y CORS.

La solución para mí fue esta publicación.

Configuración de CORS (uso compartido de recursos de origen cruzado) en Apache con encabezados de respuesta correctos que permitan que todo pase | Benjamin Horn

Sin embargo, Firefox se estaba comportando realmente, muy extraño después de configurar esos encabezados en el servidor Apache (en la carpeta .htaccess).

Agregué mucho, console.log("Hi FF, you are here A")etc. para ver qué estaba pasando.

Al principio parecía colgado xhr.send(). Pero luego descubrí que no llegaba a esta declaración. Coloqué otro console.logjusto antes y no llegué, aunque no había nada entre el último console.logy el nuevo. Simplemente se detuvo entre dos console.log.

Reordenando líneas, eliminando, para ver si había algún carácter extraño en el archivo. No encontré nada.

Reiniciar Firefox solucionó el problema.

Sí, debería presentar un error. Es solo que es tan extraño que no sé cómo reproducirlo.

AVISO : ¡Y, oh, solo hice las Header always setpartes, no la Rewrite*parte!

León
fuente
La misma historia para mí hoy, esencialmente. Reiniciar Firefox lo solucionó. Más de 5 años después.
Søren Mortensen
3

Solo agrega

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

al .htaccessarchivo en la raíz del sitio web con el que está intentando conectarse.

Gareth
fuente
Está bien si desea configurarlo para que acepte solicitudes desde cualquier lugar; no está bien si no lo hace, que es todo el punto del encabezado.
Godwhacker
2

Para la posteridad, también verifique los registros del servidor para ver si el recurso que se solicita devuelve un 200.

Me encontré con un problema similar, donde todos los encabezados adecuados se devolvían en la solicitud ajax previa al vuelo, pero el navegador informó que la solicitud real estaba bloqueada debido a encabezados CORS incorrectos.

Resulta que la página solicitada devolvía un error 500 debido a un código incorrecto, pero solo cuando se obtuvo a través de CORS. El navegador (tanto Chrome como Firefox) informó erróneamente que faltaba el encabezado Access-Control-Allow-Origin en lugar de decir que la página devolvió un 500.

Jack Stouffer
fuente
1

Prueba esto, debería resolver tu problema

  1. En su config.php, agregue www pre en su dominio.com. Por ejemplo:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
  2. Agregue esto a su archivo .htaccess

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

Para mí, resulta que estaba configurando el Access-Control-Allow-Originencabezado de respuesta en un específico (y el correcto) host.compero tenía que ser devuelto como en su http://host.comlugar. ¿Qué hace Firefox? Se traga silenciosamente la solicitud GET y devuelve un estado 0 al XHR, sin salida de advertencias a la consola de JavaScript, mientras que para otras fallas similares al menos diría algo. Ai ai.

Rogerdpack
fuente
1
Parece que el esquema es el esperado, mirando los ejemplos en w3.org/TR/cors, pero de todos modos gracias, yo también estaba haciendo algo incorrecto, y sí, falta el mensaje de error de Firefox.
Richard Green
1

Para depurar, verifique los registros del servidor si es posible. Firefox devuelve errores CORS en la consola por una gran variedad de razones.

Una de las razones es también el complemento uMatrix (y supongo que NoScript y similares).

johndodo
fuente
0

Enfrenté un problema similar, y creo que es válido estar registrado como lo solucioné:

Tengo un sistema construido básicamente sobre Symfony 3. Por motivos de autoaprendizaje y rendimiento, decidí escribir algunos scripts usando GoLang, también una API con acceso público.

My Go API espera parámetros de formato Json y también devuelve una respuesta de formato Json

Para llamar a esos GoApi que estoy usando, la mayoría, $ .ajax (jQuery) La primera prueba fue un engaño: ¡la (poco) famosa ventana emergente "Solicitud de origen cruzado bloqueada"! Luego, intenté configurar "Access-Control-Allow-Origin: *" en apache conf, htaccess, php, javascript y en cualquier lugar que pudiera encontrar en google.

¡Pero, incluso, el mismo error frustrante!

La solución fue simple: tuve que hacer solicitudes "POST" en lugar de "GET".

Para lograr eso, tuve que ajustar ambos, GoLang y JavaScript para usar GET! Una vez hecho esto, no se me bloquearon más solicitudes de origen cruzado.

Espero eso ayude

PD:

Estoy usando apache y Vhost, en Directory Block tengo

  Header always set Access-Control-Allow-Origin "*"
  Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

Recuerde: "*" significa que aceptará solicitudes de cualquier persona. (Lo cual puede ser una falta de seguridad) En mi caso está bien, porque será una API pública

PS2: Mis encabezados

Encabezados de respuesta

Access-Control-Allow-Credentials    true
Access-Control-Allow-Headers    Authorization
Access-Control-Allow-Methods    GET, POST, PUT
Access-Control-Allow-Origin http://localhost
Content-Length  164
Content-Type    application/json; charset=UTF-8
Date    Tue, 07 May 2019 20:33:52 GMT

Solicitar encabezados (469 B)

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Content-Length  81
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost:9003
Origin  http://localhost
Referer http://localhost/fibootkt/MY_app_dev.php/MyTest/GoAPI
User-Agent  Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/66.0
Diego Favero
fuente
0

Si las respuestas mencionadas anteriormente no ayudan, verifique si el servidor backend está en funcionamiento o no, ya que en mi caso el servidor se bloqueó y este error resulta ser totalmente engañoso.

Neeraj Sewani
fuente
0

En mi caso fue mi ADBLOCKER ! Por alguna razón, estaba habilitado en mi host local y causaba este error en Firefox.

Deshabilitarlo o desinstalar el complemento debería solucionar este problema.

En su caso, puede que no sea un bloqueador de anuncios, sino otro complemento de Firefox. Pruébelo en modo incógnito primero sin complementos para determinar si ese es el problema y luego deshabilite sistemáticamente los complementos hasta que encuentre al culpable.

Christian Heath
fuente
-3

Los archivos se explican por sí mismos. Haz un archivo, llámalo como quieras. En mi caso jq2.php.

<html>
<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    // document is made ready so that the program starts when we load this page       
    $(document).ready(function(){

        // it tells that any key activity in the "subcat_search" filed will execute the query.
        $("#subcat_search").keyup(function(){

            // we assemble the get link for the direction to our engine "gs.php". 
            var link1 = "http://127.0.0.1/jqm/gs.php?needle=" + $("#subcat_search").val();

            $.ajax({
                url: link1,
                // ajax function is called sending the input string to "gs.php".
                success: function(result){
                    // result is stuffed in the label.
                    $("#search_val").html(result);
                }
            });
        })   

    });
</script>
</head>

<body>

<!-- the input field for search string -->
<input type="text" id="subcat_search">
<br>
<!-- the output field for stuffing the output. -->
<label id="search_val"></label>

</body>
</html>

Ahora incluiremos un motor, crearemos un archivo, llámalo como quieras. En mi caso es 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);

He intentado que el ejemplo sea lo más sencillo posible. Y debido a que ejecuta el enlace en cada pulsación de tecla, la cuota de su API se consumirá bastante rápido.

Por supuesto, las cosas que podemos hacer no tienen fin, como poner los datos en una tabla, enviarlos a la base de datos, etc.

Áspero mehta
fuente
No publique la misma respuesta más de una vez. Y asegúrese de que su respuesta realmente responda a la pregunta. Si necesita dirigir a alguien a otro lugar para obtener más información, no es una buena respuesta.
elixenide
Hola, utilicé el enlace porque tiene más información, como requisitos previos, etc. Si cree que es apropiado, lo eliminaré.
Harsh Mehta