ejemplo javascript jquery ajax xmlhttprequest

javascript - ejemplo - Ningún encabezado ''Access-Control-Allow-Origin'' está presente en el recurso solicitado. El origen ''...'' no está, por lo tanto, permitido



xmlhttprequest object (11)

Estoy usando .htaccess para reescribir URL y utilicé la etiqueta html base para que funcione.

Ahora, cuando intento hacer una solicitud de Ajax recibo el siguiente error:

XMLHttpRequest no puede cargar http://www.wordicious.com/login.php . Ningún encabezado ''Access-Control-Allow-Origin'' está presente en el recurso solicitado. El origen '' http://wordicious.com '' no está, por lo tanto, permitido.


Por qué se produce el error:

El código JavaScript está limitado por la misma política de origen , es decir, desde una página en www.example.com , solo puede realizar solicitudes (AJAX) a servicios ubicados exactamente en el mismo dominio, en ese caso, exactamente www.example.com ( no example.com - sin www - o whatever.example.com ).

En su caso, su código Ajax está tratando de llegar a un servicio en http://wordicious.com desde una página ubicada en http://www.wordicious.com .

Aunque son muy similares, no son del mismo dominio. Y cuando no están en el mismo dominio, la solicitud solo será exitosa si la restauración del objetivo contiene un encabezado Access-Control-Allow-Origin .

Como su página / servicio en http://wordicious.com nunca se configuró para presentar dicho encabezado, se muestra ese mensaje de error.

Solución:

Como se dijo, el origen (donde la página con JavaScript está en) y el destino (donde el JavaScript está tratando de llegar) los dominios deben ser exactamente iguales.

Tu caso parece un error tipográfico. Parece que http://wordicious.com y http://www.wordicious.com son en realidad el mismo servidor / dominio. Por lo tanto, para corregir, escriba el destino y el origen por igual: haga que las páginas / servicios de solicitud de código Ajax sean http://www.wordicious.com no http://wordicious.com . (Tal vez coloque la URL objetivo relativamente, como ''/login.php'' , sin el dominio).



En una nota más general:

Si el problema no es un error tipográfico como el de esta pregunta, la solución sería agregar Access-Control-Allow-Origin al dominio de destino . Para agregarlo, depende, por supuesto, del servidor / idioma detrás de esa dirección. A veces, una variable de configuración en la herramienta hará el truco. Otras veces tendrá que agregar los encabezados a través del código usted mismo.


Añádelo a tu archivo PHP o al controlador principal

header("Access-Control-Allow-Origin: http://localhost:9000");


Básicamente, modifique la respuesta del encabezado API agregando los siguientes parámetros adicionales.

Access-Control-Allow-Credentials: cierto

Access-Control-Allow-Origin: *

Pero esta no es una buena solución cuando se trata de la seguridad


Debe agregar esto al inicio de su página php "login.php"

<?php header(''Access-Control-Allow-Origin: *''); ?>



Me encuentro con este problema cuando uso Angular para publicar un registro en el back-end de Django REST . A veces, no hay una razón particular para este problema. Verifique cuidadosamente el mensaje de error de Django, encontrará una solución.


Para el servidor .NET puede configurar esto en web.config como se muestra a continuación

<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" /> </customHeaders> </httpProtocol> </system.webServer>

Por ejemplo, digamos, si el dominio del servidor es http://live.makemypublication.com y el cliente es http://www.makemypublication.com y luego se configura en el servidor web.config como se muestra a continuación.

<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" /> </customHeaders> </httpProtocol> </system.webServer>


Resuelto con la entrada a continuación en httpd.conf

#CORS Issue Header set X-Content-Type-Options "nosniff" Header always set Access-Control-Max-Age 1728000 Header always set Access-Control-Allow-Origin: "*" Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH" Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control" Header always set Access-Control-Allow-Credentials true #CORS REWRITE RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS #RewriteRule ^(.*)$ $1 [R=200,L] RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]


Si obtiene este mensaje de error del navegador:

Ningún encabezado ''Access-Control-Allow-Origin'' está presente en el recurso solicitado. El origen ''...'' no está, por lo tanto, permitido

cuando intenta hacer una solicitud POST / GET de Ajax a un servidor remoto que está fuera de su control, olvídese de esta solución simple:

<?php header(''Access-Control-Allow-Origin: *''); ?>

Lo que realmente necesita hacer, especialmente si solo usa JavaScript para hacer la solicitud de Ajax, es un proxy interno que toma su consulta y la envía al servidor remoto.

Primero en su JavaScript, haga una llamada de Ajax a su propio servidor, algo como:

$.ajax({ url: yourserver.com/controller/proxy.php, async:false, type: "POST", dataType: "json", data: data, success: function (result) { JSON.parse(result); }, error: function (xhr, ajaxOptions, thrownError) { console.log(xhr); } });

Luego, cree un archivo PHP simple llamado proxy.php para envolver sus datos POST y anexarlos al servidor URL remoto como parámetros. Le doy un ejemplo de cómo evito este problema con la API de búsqueda de hoteles de Expedia:

if (isset($_POST)) { $apiKey = $_POST[''apiKey'']; $cid = $_POST[''cid'']; $minorRev = 99; $url = ''http://api.ean.com/ean-services/rs/hotel/v3/list?'' . ''cid=''. $cid . ''&'' . ''minorRev='' . $minorRev . ''&'' . ''apiKey='' . $apiKey; echo json_encode(file_get_contents($url)); }

Haciendo:

echo json_encode(file_get_contents($url));

Simplemente está haciendo la misma consulta pero en el lado del servidor y después de eso, debería funcionar bien.


Use addHeader lugar de usar el método setHeader ,

response.addHeader("Access-Control-Allow-Origin", "*");

* en la línea superior permitirá el access to all domains .

Para permitir el access to specific domain only :

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

Mira esta blog post .


tienes que poner las llaves / valores de los encabezados en la respuesta del método de opciones. por ejemplo, si tiene un recurso en http://mydomain.com/myresource , en el código del servidor escribe

//response handler void handleRequest(Request request, Response response) { if(request.method == "OPTIONS") { response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com") response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "Content-Type"); } }