Sto tentando di impostare la condivisione di risorse Cross-Origin semplice utilizzando javery (1.7.1) ajax sul client e server python (django) apache. Secondo tutte le istruzioni che ho letto i miei intestazioni siano impostate correttamente, ma io continuo a ricevere il seguente errore:CORS Access-Control-Allow-Origin nonostante le intestazioni corrette
XMLHttpRequest cannot load http://myexternaldomain.com/get_data . Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin.
L'intestazione essendo che sto cercando di (io non sono sicuro che è anche sempre passato il browser) invia è:
Request URL:http://myexternaldomain.com/get_data
Accept:application/json, text/javascript, */*; q=0.01
Origin:http://localhost:8080
Referer:http://localhost:8080/static/js/test-zetta.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11
Il codice JavaScript viene
var request = $.ajax({
url : "http://myexternaldomain.com/get_data",
type : "POST",
dataType : "json",
crossDomain : true
});
noti che origin
è impostato correttamente. Il server aggiunge l'intestazione Access-Control-Allow-Origin = *
utilizzando il seguente codice python
def process_response(self, response):
if response.has_header('Access-Control-Allow-Origin'):
return response
response['Access-Control-Allow-Origin'] = '*'
return response
def get_orders(request):
""" Tell worker what to do """
response_data = {}
response_data['action'] = 'probe'
response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json"))
return response
Se visito direttamente l'indirizzo, sembra confermare che l'intestazione è impostato correttamente
Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Thu, 08 Mar 2012 05:06:25 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Tuttavia nel dominio croce impostazione fallisce sempre (ho provato sia Chrome che Firefox). Ho provato l'attuazione del codice esattamente come per la risposta selezionata per this domanda, ma ottengo lo stesso errore
Aggiornamento
Sono abbastanza sicuro che il problema sia lato server, come ho già riuscito ad ottenere le mie chiamate ajax funzionano con un diverso server pubblico CORS abilitato. Quando paragono le intestazioni provenienti da questo server pubblico e quelle restituite dalla mia (quando provo dallo stesso dominio), non riesco a vedere nessuna differenza importante che possa spiegare la differenza (vedi sotto).
Una sottigliezza che ho escluso, che può o potrebbe essere importante è che il dominio effettivo è un dominio amazon di più sottodomini. L'indirizzo reale è http://ec2-23-20-27-108.compute-1.amazonaws.com/get_orders, sentiti libero di verificarlo per vedere cosa sto facendo male.
Dal server pubblico
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:622
Content-Type:text/html
Date:Thu, 08 Mar 2012 15:33:20 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:Perl/5.8.7, PHP/4.4.0
dal mio server - (non funzionante dominio croce)
Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:text/plain
Date:Thu, 08 Mar 2012 15:32:24 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
In passato ho provato a abilitare CORS per i dati Json e non ha mai avuto successo. CORS può essere traballante come quello. Faresti molto meglio a tornare JSON-P. – xbonez
Stai solo pubblicando le intestazioni dallo scambio _final_ tra il tuo server remoto e il client locale. Se osservi lo scambio completo, sono sicuro che vedrai una richiesta OPTIONS insieme a una risposta che contiene le intestazioni Access-Control-Allow-Methods e Access-Control-Allow-Headers. –