¿Cómo puedo acceder al encabezado de longitud de contenido desde una solicitud AJAX de dominio cruzado?

StackOverflow https://stackoverflow.com/questions/4850288

Pregunta

Mi aplicación JavaScript debe determinar la duración de un recurso antes de Descargarlo con Ajax. Por lo general, esto no es un problema, solo haces una solicitud de cabeza y extraes el Content-Length.

var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")  
// "2195"

Sin embargo, los recursos se almacenan en un servidor diferente al cliente. (Un servidor que controlo). Así que estoy usando CORS para realizar solicitudes AJAX de dominio cruzado, y he configurado el servidor para responder a las solicitudes previas a la luz de las solicitudes de la cabeza y obtener/publicar solicitudes con encabezados personalizados.

Eso está funcionando muy bien en general, pero parece que no puedo encontrar una forma de extraer el Content-Length De la respuesta de la cabeza cuando se trabaja con CORS:

var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// ERROR: Refused to get unsafe header "Content-Length"

He experimentado con la configuración de varios encabezados en la realización previa o en la respuesta, como

Access-Control-Expose-Headers: Content-Length

que la especificación parece sugerir debería ponerla a disposición. Pero no importa lo que haga, parece que no puedo poner el encabezado de contenido disponible para el cliente. ¿Alguna sugerencia?

(Chrome 8)

¿Fue útil?

Solución

He encontrado que el soporte de encabezado de respuesta de Cors en todos los navegadores es erróneo. En Chrome/Safari, solo veo encabezados de respuesta simples (http://www.w3.org/tr/cors/#terminology) en el resultado de GetAllResponseHeaders (), incluso cuando el "cabezal de accesorios-expose-Headers" encabezado " se establece en la respuesta. Y en Firefox 3.6.13, GetAllResponseHeaders () no devuelve nada (ni siquiera encabezados de respuesta simples). Como solución, supongo que podría sobrecargar uno de los encabezados de respuesta simples para incluir la longitud del contenido, pero eso puede causar otros problemas, y aún así no solucionaría Firefox.

Otros consejos

Estaba teniendo el mismo problema, hasta que encontré un hilo en otro lugar que me enseñó a agregar esta línea en mi .htaccess:

Header add Access-Control-Expose-Headers "Content-Length"

Entonces Boom, se solucionó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top