CORS Access-Control-Permen-Origen a pesar de los encabezados correctos
-
09-12-2019 - |
Pregunta
Estoy tratando de configurar el intercambio de recursos simple de origen cruzado con JQuery (1.7.1) Ajax alimentado en el cliente y Apache servido al servidor Python (Django). De acuerdo con todas las instrucciones que he leído, mis encabezados están configurados correctamente, pero sigo recibiendo el siguiente error:
XMLHTTTPRequest no puede cargar http://myexternaldomain.com/get_data . Origen http:// localhost: 8080 no está permitido por Acceso-Control-Permitir-Origen.
El encabezado que estoy tratando de haber intentado (no estoy seguro de que incluso está pasando el navegador) El envío es:
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
El código JavaScript es
var request = $.ajax({ url : "http://myexternaldomain.com/get_data", type : "POST", dataType : "json", crossDomain : true });
Tenga en cuenta que
origin
está configurado correctamente. El servidor agrega el encabezadoAccess-Control-Allow-Origin = *
mediante el siguiente código Pythondef 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
Si visito la dirección directamente, parece confirmar que el encabezado se está configurando correctamente
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
Sin embargo, en el ajuste de dominio cruzado, siempre falla (intentado tanto Chrome como Firefox). He intentado implementar el código exactamente según la respuesta seleccionada a esta pregunta , pero obtén el mismo error
actualización
Estoy bastante seguro de que el problema es el lado del servidor, ya que he logrado obtener mis llamadas AJAX trabajando con un servidor de CORS PUBLICO DIFERENTE PUBLICO. Cuando compare los encabezados que regresan de este servidor público, y los regresaron de la mía (cuando pruebo del mismo dominio), no puedo ver ninguna diferencia importante que pueda explicar la diferencia (ver más abajo).
Una sutileza que excluíé, lo que puede o puede ser importante es que el dominio real es un dominio de Amazon de varios subdominios. La real direccional es http: / /EC2-23-20-27-108.COMPUTE-1.AMAZONAWS.COM/GET_ORTERS , no dude en investigarlo para ver lo que estoy haciendo mal.
del servidor público
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
de mi servidor - (no funciona el dominio cruzado)
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
Solución
Así que estaba siendo engañado por la respuesta de ir a la URL, y de hecho, el problema era que al realizar la solicitud AJAX, estaba obteniendo un error 403 (solo revelado en Firefox no Chrome) debido a la protección de CSRF.
Otros consejos
Tiene que implementar una solicitud y respuesta "anticipada" antes de que su situación cuenta como " No tan simple ". Las cors básicas, que solo se requieren el encabezado de origen, solo pueden tener tipos de contenido de "Aplicación / X-WWW-Form-URLENCODED", "Multipart / Format-Data", y "Texto / Plain". Desde que regresa "Aplicación / JSON", no cumple con este requisito.
No sé nada sobre Django, pero me resultó más fácil implementar el soporte de CORS fuera de mi solicitud a través del uso de un Tomcat Filter . Parece que puedes hacer lo mismo con django.
2013-08-11: parece que el repo de GitHub ya no está con nosotros. Pero el paquete de Django parece estar disponible en https://pypi.python.org/ PYPI / DJANGO-CORS / 0.1
Estaba usando el excelente Django-CORS-HEADERS-HEADERS y corrió a este problematambién.Para mí, la solución fue agregar 'Aceptar-codificación' a la tupla de cors_allow_headers predeterminada.