2012-08-13 7 views
13

Estoy intentando dar una respuesta al método HTTP OPTIONS con un encabezado Access-Control-Allow-Origin que copia los contenidos del encabezado Origin en la solicitud.El encabezado Access-Control-Allow-Origin no funciona: ¿Qué estoy haciendo mal?

Esto aparentemente no funciona, por razones que no puedo entender.

tl; dr: respuesta de OPCIONES dice:

Access-Control-Allow-Origin: http://10.0.0.105:9294 

GET posterior tiene:

Origin:http://10.0.0.105:9294 

Chrome dice:

Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin 

no wtf?

Más detalles ...

Al mirar en la ventana de herramientas para desarrolladores de Chrome, los encabezados de la solicitud son:

OPTIONS /user/kris HTTP/1.1 
Host: 10.0.0.104:8080 
Connection: keep-alive 
Access-Control-Request-Method: GET 
Origin: http://10.0.0.105:9294 
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.75 Safari/537.1 
Access-Control-Request-Headers: origin, x-requested-with, content-type, accept 
Accept: */* 
Referer: http://10.0.0.105:9294/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Las cabeceras de respuesta son:

HTTP/1.0 200 OK 
Date: Mon, 13 Aug 2012 11:23:45 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Content-Length: 0 
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS 
Access-Control-Max-Age: 10 
Access-Control-Allow-Origin: http://10.0.0.105:9294 
Access-Control-Allow-Headers: X-Requested-With, Authorization, X-Huzu-User, Content-Type, Accept 
Content-Type: text/html; charset=UTF-8 

Después de jQuery envía su OPCIONES solicita y obtiene la respuesta anterior, ocurren 2 cosas raras. La respuesta OPCIONES (que es un 200) se muestra en la consola de desarrolladores como un error:

OPTIONS http://10.0.0.104:8080/user/kris 200 (OK) 

Después de lo cual una petición GET es rechazada. Error en la consola:

XMLHttpRequest cannot load http://10.0.0.104:8080/user/kris. Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin. 

No puedo ver por qué no. ¿Qué estoy haciendo mal?

+0

No tengo un ejemplo mínimo de error del código de jQuery que sería útil publicar aquí. Supongamos que el código de JavaScript no tiene nada de extraño, es decir, que se trata de un solo jQuery get(), lo que da como resultado la solicitud OPTIONS publicada anteriormente. Mi pregunta es: ¿qué pasa con la respuesta? – scav

+0

¿Soy yo o hay una diferencia entre la URL del host (10.0.0.104:8080) y la URL del refere (10.0.0.105:9294/)? – rene

+0

@rene, sí. Mi servidor es una aplicación python wsgi que se ejecuta en mi máquina local (10.0.0.104:8080), y las pruebas entre sitios están ocurriendo desde una página que estoy cargando desde 10.0.0.105:9294.No sé qué efecto tiene el referer sobre el control de acceso. ¿Crees que es relevante? Si es así, ¿qué hago con eso? – scav

Respuesta

20

Bien, creo que lo tengo. Parece que es necesario un manejo adecuado de la solicitud de OPCIONES previas al vuelo, pero NO ES SUFICIENTE para que funcionen las solicitudes de recursos entre sitios.

Después de la solicitud OPCIONES regresa con cabeceras satisfactorios, todas las respuestas a las solicitudes posteriores a la misma URL también tiene que tener la necesaria cabecera "Access-Control-Allow-Origen", de lo contrario el navegador se deshará, y ni siquiera aparecerán en la ventana del depurador.

Parece que parece el navegador canceló la solicitud debido a algún problema en la respuesta OPTIONS, pero en realidad, el buscador está mirando los encabezados de respuesta de la solicitud real y luego los rechaza.

+0

Desde que lo hicimos con tu consulta, ¿puedes ayudarme en esta pregunta similar? ? http://stackoverflow.com/questions/11953132/no-response-obtained-while-implementing-cors –

+3

@scav Cómo lo resolvió – Hunt

+0

@scav +1 No puedo agradecerle lo suficiente. ¡Me salvaste horas de depuración! – alf

Cuestiones relacionadas