javascript - El origen no está permitido por Access-Control-Allow-Origin
Estoy haciendo una Ajax.request a un servidor PHP remoto en una aplicación Sencha Touch 2 (empaquetada en PhoneGap).
La respuesta del servidor es la siguiente:
XMLHttpRequest no puede cargar http://nqatalog.negroesquisso.pt/login.php. El
http://localhost:8888de origen no está permitido por Access-Control-Allow-Origin.
¿Cómo puedo solucionar este problema?
Respuesta #1
Escribí un artículo sobre este tema hace un tiempo, AJAX de dominio cruzado.
La forma más fácil de manejar esto si tienes control del servidor que responde es agregar un encabezado de respuesta para:
Access-Control-Allow-Origin: *
Esto permitirá Ajax entre dominios. En PHP, querrás modificar la respuesta así:
<?php header('Access-Control-Allow-Origin: *'); ?>
Simplemente puedes poner la configuración Header set Access-Control-Allow-Origin * en la configuración de Apache o en el archivo htaccess.
Cabe señalar que esto desactiva efectivamente la protección CORS, lo que muy probablemente expone a sus usuarios a ataques. Si no sabe que necesita usar específicamente un comodín, no debería usarlo y, en su lugar, debería incluir en la lista blanca su dominio específico:
<?php header('Access-Control-Allow-Origin: http://example.com') ?>
Respuesta #2
Si no tienes control del servidor, simplemente puedes añadir este argumento a tu lanzador de Chrome: --disable-web-security.
Tenga en cuenta que no usaría esto para la "navegación web" normal. Para referencia, vea esta publicación: Desactivar la política del mismo origen en Chrome.
Una vez que uses Phonegap para realmente construir la aplicación y cargarla en el dispositivo, esto no será un problema.
Respuesta #3
Si estás usando Apache, simplemente añade:
<ifModule mod_headers.c>
Header set Access-Control-Allow-Origin: *
</ifModule>
en tu configuración. Esto hará que todas las respuestas de tu servidor web sean accesibles desde cualquier otro sitio en internet. Si tu intención es permitir que solo los servicios en tu host sean utilizados por un servidor específico, puedes reemplazar el * con la URL del servidor de origen:
Header set Access-Control-Allow-Origin: http://my.origin.host
Respuesta #4
Si tienes una aplicación ASP.NET/ASP.NET MVC, puedes incluir este encabezado a través del archivo Web.config:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<!-- Enable Cross Domain AJAX calls -->
<remove name="Access-Control-Allow-Origin" />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
Respuesta #5
Esta fue la primera pregunta/respuesta que me apareció al intentar resolver el mismo problema usando ASP.NET MVC como la fuente de mis datos. Me doy cuenta de que esto no resuelve la pregunta de PHP, pero está lo suficientemente relacionado como para ser valioso.
Estoy usando ASP.NET MVC. El artículo del blog de Greg Brant funcionó para mí. En última instancia, creas un atributo, [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")], que puedes agregar a las acciones del controlador.
Por ejemplo:
public class HttpHeaderAttribute : ActionFilterAttribute
{
public string Name { get; set; }
public string Value { get; set; }
public HttpHeaderAttribute(string name, string value)
{
Name = name;
Value = value;
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.AppendHeader(Name, Value);
base.OnResultExecuted(filterContext);
}
}
Y luego usándolo con:
[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
return Json( "Some public result" );
}
Respuesta #6
Como Matt Mombrea tiene razón sobre el lado del servidor, podrías encontrarte con otro problema que es el rechazo de la lista blanca.
Tienes que configurar tu phonegap.plist. (Estoy usando una versión antigua de phonegap)
Para Cordova, podría haber algunos cambios en los nombres y en el directorio. Pero los pasos deberían ser en su mayoría los mismos.
Primero selecciona Archivos de soporte > PhoneGap.plist
entonces bajo "ExternalHosts"
Añade una entrada, con un valor quizás de "http://nqatalog.negroesquisso.pt" que estoy usando * solo para fines de depuración.

