Aquí hay dos páginas, test.php y testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Ahora mi problema: cuando ambos archivos están en el mismo servidor (localhost o servidor web), funciona y alert("Success")
se llama; Si está en diferentes servidores, lo que significa que testserver.php en el servidor web y test.php en localhost, no funciona y se alert("Error")
está ejecutando. Incluso si la URL dentro de ajax se cambia a http://domain.com/path/to/file/testserver.php
javascript
jquery
ajax
json
cross-domain
Firose Hussain
fuente
fuente
Respuestas:
Usa JSONP .
jQuery:
PHP:
El eco puede estar equivocado, ha pasado un tiempo desde que usé php. En cualquier caso, debe dar salida a
callbackName('jsonString')
las cotizaciones. jQuery pasará su propio nombre de devolución de llamada, por lo que debe obtenerlo de los parámetros GET.Y como Stefan Kendall publicó, $ .getJSON () es un método abreviado, pero luego debe agregar
'callback=?'
a la url como parámetro GET (sí, el valor es?, JQuery reemplaza esto con su propio método de devolución de llamada generado).fuente
callbackName('/* json */')
lugar decallbackName(/* json */)
?JSONP es una buena opción, pero hay una manera más fácil. Simplemente puede configurar el
Access-Control-Allow-Origin
encabezado en su servidor. Al configurarlo,*
se aceptarán solicitudes AJAX entre dominios de cualquier dominio. ( https://developer.mozilla.org/en/http_access_control )El método para hacerlo variará de un idioma a otro, por supuesto. Aquí está en Rails:
En este ejemplo, la
say_hello
acción aceptará solicitudes AJAX de cualquier dominio y devolverá una respuesta de "¡hola!".Aquí hay un ejemplo de los encabezados que podría devolver:
Tan fácil como es, tiene algunas limitaciones de navegador. Ver http://caniuse.com/#feat=cors .
fuente
.post()
método de jQuery, debe habilitar la compatibilidad entre dominios en jQuery. Se realiza con esto:$.support.cors = true
.Puede controlar esto a través del encabezado HTTP agregando Access-Control-Allow-Origin . Al establecerlo en * se aceptarán solicitudes AJAX de dominio cruzado de cualquier dominio.
Usar PHP es realmente simple, solo agregue la siguiente línea en el script al que desea tener acceso fuera de su dominio:
No olvide habilitar el módulo mod_headers en httpd.conf.
fuente
Debes echar un vistazo a la Política del mismo origen :
Para que pueda obtener datos, tiene que ser:
Mismo protocolo y host
Debe implementar JSONP para solucionarlo.
fuente
Tuve que cargar la página web desde el disco local "archivo: /// C: /test/htmlpage.html", llamar a la url "http: //localhost/getxml.php" y hacer esto en los navegadores IE8 + y Firefox12 +, usar jQuery v1 .7.2 lib para minimizar el código repetitivo. Después de leer docenas de artículos finalmente lo descubrí. Aquí está mi resumen.
Aquí hay un ejemplo de llamada jQuery ajax con algunos sysouts de depuración.
fuente
header("Access-Control-Allow-Origin: *");
Es cierto que la política del mismo origen evita que JavaScript realice solicitudes en todos los dominios, pero la especificación CORS permite el tipo de acceso a la API que está buscando y es compatible con el lote actual de los principales navegadores.
Vea cómo habilitar el intercambio de recursos de origen cruzado para el cliente y el servidor:
http://enable-cors.org/
"Cross-Origin Resource Sharing (CORS) es una especificación que permite un acceso verdaderamente abierto a través de los límites del dominio. Si sirve contenido público, considere usar CORS para abrirlo para el acceso universal de JavaScript / navegador".
fuente
Esto es posible, pero debe usar JSONP, no JSON. El enlace de Stefan te señaló en la dirección correcta. La página jQuery AJAX tiene más información sobre JSONP.
Remy Sharp tiene un ejemplo detallado usando PHP .
fuente
Yo uso el servidor Apache, así que he usado el módulo mod_proxy. Habilitar módulos:
Luego añade:
Finalmente, pase proxy-url a su script.
fuente
La seguridad del navegador impide realizar una llamada ajax desde una página alojada en un dominio a una página alojada en un dominio diferente; esto se llama la " política del mismo origen ".
fuente
Hay algunos ejemplos para usar JSONP que incluyen manejo de errores.
Sin embargo, tenga en cuenta que el evento de error no se activa al usar JSONP. Consulte: http://api.jquery.com/jQuery.ajax/ o la solicitud jQuery ajax utilizando el error jsonp
fuente
De los documentos de Jquery ( enlace ):
Debido a restricciones de seguridad del navegador, la mayoría de las solicitudes "Ajax" están sujetas a la misma política de origen; la solicitud no puede recuperar correctamente datos de un dominio, subdominio o protocolo diferente.
Las solicitudes de script y JSONP no están sujetas a las mismas restricciones de política de origen.
Por lo tanto, supongo que debe usar jsonp para la solicitud. Pero no lo he intentado yo mismo.
fuente
Sé 3 maneras de resolver su problema:
Primero, si tiene acceso a ambos dominios, puede permitir el acceso a todos los demás dominios utilizando:
header("Access-Control-Allow-Origin: *");
o simplemente un dominio agregando código debajo del archivo .htaccess:
<FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>
puede tener una solicitud ajax a un archivo php en su servidor y manejar la solicitud a otro dominio utilizando este archivo php.
fuente
Para Microsoft Azure, es ligeramente diferente.
Azure tiene una configuración CORS especial que debe establecerse. Es esencialmente lo mismo detrás de escena, pero simplemente establecer el encabezado que menciona joshuarh no funcionará. La documentación de Azure para habilitar el dominio cruzado se puede encontrar aquí:
https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript
Estuve jugando con esto durante unas horas antes de darme cuenta de que mi plataforma de alojamiento tenía esta configuración especial.
fuente
funciona, todo lo que necesitas:
PHP:
JS (jQuery ajax):
fuente