2011-02-14 11 views
6

Estoy en site.com tratando de agarrar algunos datos JSON desde mi servidor Node.js servir en el puerto 8080.Cruz ajax dominio JSON

me sale este mensaje de error:

XMLHttpRequest cannot load http://site.com:8080/json/1. Origin http://site.com is not allowed by Access-Control-Allow-Origin. 

mi código :

$.get('http://site.com:8080/1/', {}, function (Data) { 
     console.log(Data); 
    }, "json"); 

¡Pero es el mismo dominio! :(

Considera también mi modelo Backbone.js:

model = Backbone.Model.extend({ 
    url: function() { 
     return 'http://site.com:8080/' + this.id 
    } 
}); 

¿Hay alguna manera de resolver este aparte de usar jsonp

Gracias

+9

Los puertos también deben coincidir, de lo contrario, jsonp es la única opción. –

+0

Tengo el mismo problema. En mi humilde opinión, esto debe aclararse en la documentación (que los puertos se consideran parte del dominio). Además, ¿las solicitudes en los subdominios también son ilegales? – snapfractalpop

Respuesta

2

Como alternativa, podría modificar su servidor node.js para permitir Compartir recursos de origen cruzado (CORS). Esto solo funciona en navegadores modernos. La cosa más simple (y menos segura) sería que su servidor node.js emitiera el encabezado "Access-Control-Allow-Origin: http://site.com". Puede obtener más información acerca de CORS aquí: http://www.w3.org/TR/cors/

+0

Hola, ¿podría explicar por qué esto no sería seguro? – FriiSource

+0

El encabezado de solicitud de origen indica de dónde proviene la solicitud entre dominios. Lo menos seguro sería permitir que cualquier sitio de terceros acceda a sus datos (es decir, configure "Access-Control-Allow-Orgin: *"). Esto puede ser lo que desee, si sus datos son públicos, pero debe usarlos con cuidado. Algo más seguro es leer el encabezado de Origin y verificar que sea un dominio aprobado, y luego solo emita el encabezado "Access-Control-Allow-Orgin: http://site.com" para los dominios aprobados. – monsur

7

Si estás haciendo la llamada. en el mismo dominio, ¿por qué tiene la ruta absoluta en su solicitud $.get?

Pruebe esto:

$.get('/1/', {}, function (Data) { 
    console.log(Data); 
}, "json"); 


model = Backbone.Model.extend({ 
    url: function() { 
     return '/' + this.id 
    } 
}); 

Si realmente está haciendo la llamada en el mismo dominio, entonces el código anterior debería funcionar.

0

Debe realizar la llamada al mismo dominio y el puerto desde donde se cargó su script. Deberías poder usar el código de jmort.