2011-09-14 18 views
9

Esto no parece funcionar:AJAX entre dominios de verificación previa comprobación no Origen

$.ajax({ 
    url:  "http://localhost:3000/foo.json", 
    data:  { foo: 'bar' }, 
    headers: { 'HTTP_X_CUSTOMHEADER': 'foobar' }, 
    xhrFields: { withCredentials: true } 
}); 

Cuando corro en jsFiddle, una solicitud OPTIONS (de acuerdo a las herramientas de depuración Chrome) dispara que tiene este aspecto:

Access-Control-Request-Headers: Origin, HTTP_X_CUSTOMHEADER, Accept 
Access-Control-Request-Method: GET 
Origin:       http://fiddle.jshell.net 

Y luego (de acuerdo con las herramientas de depuración Chrome) mi servidor local devuelve los siguientes encabezados:

(reordenada en forma manual para Reada bilidad)

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Headers:  HTTP_X_CUSTOMHEADER 
Access-Control-Allow-Methods:  GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin:  http://fiddle.jshell.net 
Access-Control-Max-Age:   10 

Cache-Control:     no-cache 
Connection:      Keep-Alive 
Content-Length:     1 
Content-Type:      text/html; charset=utf-8 
Date:        Wed, 14 Sep 2011 22:42:28 GMT 
Server:       WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10) 
X-Runtime:      2 

Y luego, en la consola aparece un mensaje de error como este:

XMLHttpRequest cannot load http://localhost:3000/foo.json?foo=bar. 
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin. 

de cabeza, pero Access-Control-Allow-Origin parece idéntica a cuando mi servidor respondió con la solicitud de verificación previa. Entonces, ¿qué pieza me falta aquí de este rompecabezas?

+0

¿Cómo se ven los encabezados de la solicitud saliente? Deben incluir un encabezado [Origen:] (https://developer.mozilla.org/en/HTTP_access_control). Sin embargo, creo que el navegador [siempre lo agrega] (https://developer.mozilla.org/en/HTTP_access_control#Origin). – daxelrod

+0

Actualizó la pregunta con los encabezados de la solicitud de opciones. –

Respuesta

4

OHHHHH, bien me di cuenta de esto, finalmente ...

Al parecer, las cabeceras de respuesta de verificación previa OPTIONS enviaban el único lugar que los necesita. También debe incluir esos encabezados en la respuesta para el contenido real. Solo tuve estos encabezados en la verificación previa, pensando que ese era el único "boleto" necesario.

Así que agregué los mismos encabezados a la solicitud GET para el activo real y todo funciona bien ahora. Supongo que me perdí eso en los documentos.

+2

¿Podría entrar en más detalles? Estoy atrapado en el infierno de CORS: http://stackoverflow.com/questions/13318436/https-access-control-allow-origin-not-working-no-matter-what-with-php-5-3-apac –

+0

¿Me pueden ayudar con este http://stackoverflow.com/questions/41952995/response-status-is-0-in-jquery-ajax?noredirect=1#comment71099392_41952995? – SSS

1

Debe incluir Origin en la sección Control de acceso-Permitir encabezados, ya que Origin no se considera un encabezado simple (IMO, la especificación debe incluir Origin en la lista de encabezados simples).

+0

Cambié los encabezados de respuesta OPTIONS para incluir 'Access-Control-Allow-Headers: HTTP_X_CUSTOMHEADER, Origin, Accept' pero no cambió nada. –

Cuestiones relacionadas