headers - cors javascript
Solicitud CORS de Firefox que da ''Solicitud de origen cruzado bloqueada'' a pesar de los encabezados (9)
Intento hacer una solicitud simple de origen cruzado, y Firefox lo bloquea constantemente con este error:
Solicitud de origen cruzado bloqueada: la misma política de 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 mi servidor está respondiendo con
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 todo lo que no es Firefox. ¿Alguien puede ayudarme con esto?
Descubrí que mi problema era: que el servidor al que envié la solicitud cruzada tenía un certificado que no era de confianza.
Si desea conectarse a un dominio cruzado con https (firefox), primero debe agregar la excepción para este certificado.
Puede hacer esto, visite el enlace bloqueado una vez y agregue la excepción.
¡Espero que esto ayude a alguien!
Encontré una solución después de 2 días :(.
Nota importante: al responder a una solicitud con credencial, el servidor debe especificar un dominio y no puede usar el cardado comodín.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
Los archivos son auto explicativos. Haz un archivo, llámalo cualquier cosa. 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, lo llamaremos como prefiera. 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);
Intenté mantener el ejemplo lo más simple 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.
Para mí, resultó que estaba configurando Access-Control-Allow-Origin
a un host.com
específico (y el correcto), pero tenía que ser http://host.com
. ¿Qué hace Firefox? Se traga silenciosamente la solicitud GET y devuelve un estado 0 al XHR, sin advertencias enviadas a la consola de JavaScript, mientras que para otras fallas similares, al menos, podría decir algo. Ai ai.
Parece ser un error en Firefox 44 corregido en la versión 45.
Prueba esto, debería resolver tu problema
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/'');
Agregue esto a su archivo .htaccess
RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
Resulta que esto no tiene nada que ver con CORS, era un problema con el certificado de seguridad. Errores engañosos = 4 horas de dolores de cabeza.
Solo agrega
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
al archivo .htaccess
en la raíz del sitio web con el que intentas conectarte.
Solo una palabra de advertencia. Finalmente solucioné el problema con Firefox y CORS.
La solución para mí fue esta publicación
Configuración de CORS (intercambio de recursos de origen cruzado) en Apache con encabezados de respuesta correctos que permiten todo a través | Benjamin Horn
Sin embargo, Firefox se comportaba de manera realmente extraña después de configurar esos encabezados en el servidor Apache (en la carpeta .htaccess).
console.log("Hi FF, you are here A")
un montón de console.log("Hi FF, you are here A")
etc. para ver qué estaba pasando.
Al principio parecía colgado en xhr.send()
. Pero luego descubrí que no llegó a esta declaración. Puse otro console.log
justo antes y no llegué, aunque no había nada entre el último console.log
y el nuevo. Simplemente se detuvo entre dos console.log
.
Reordenando líneas, borrando, para ver si había algún caracter 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, así que no sé cómo reproducirlo.
AVISO : Y, ¡oh, acabo de hacer que el Header always set
partes, no la parte Rewrite*
!