2011-01-31 37 views
15

Ứng dụng JavaScript của tôi cần xác định độ dài của tài nguyên trước khi tải xuống bằng Ajax. Thông thường đây không phải là một vấn đề, bạn chỉ cần thực hiện một yêu cầu HEAD và trích xuất các Content-Length.Làm cách nào để truy cập vào tiêu đề Nội dung dài từ yêu cầu Ajax tên miền chéo?

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

Tuy nhiên, tài nguyên được lưu trữ trên máy chủ khác cho khách hàng. (Một máy chủ tôi kiểm soát). Vì vậy, tôi đang sử dụng CORS để thực hiện các yêu cầu ajax miền chéo và đã thiết lập máy chủ để phản hồi các yêu cầu preflighting cho các yêu cầu HEAD và các yêu cầu GET/POST với các tiêu đề tùy chỉnh.

Đó là làm việc lớn trong chính, nhưng tôi dường như không thể tìm ra cách giải nén Content-Length từ phản ứng TRỤ khi làm việc với CORS:

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

tôi đã thử nghiệm với thiết tiêu đề khác nhau trong preflighting hoặc trong phản hồi, chẳng hạn như

Access-Control-Expose-Headers: Content-Length 

mà đặc điểm kỹ thuật có vẻ đề xuất sẽ làm cho nó khả dụng. Nhưng không có vấn đề gì tôi làm, tôi dường như không thể làm cho tiêu đề Content-Length có sẵn cho khách hàng. Bất kỳ đề xuất?

(Chrome 8)

Trả lời

3

Tôi đã tìm thấy hỗ trợ tiêu đề phản hồi CORS trong tất cả các trình duyệt bị lỗi. Trong Chrome/Safari, tôi chỉ thấy các tiêu đề phản hồi đơn giản (http://www.w3.org/TR/cors/#terminology) trong kết quả của getAllResponseHeaders(), ngay cả khi tiêu đề "Access-Control-Expose-Headers" được đặt trong phản hồi. Và trong Firefox 3.6.13, getAllResponseHeaders() không trả về bất kỳ thứ gì (thậm chí không phải là các tiêu đề phản hồi đơn giản). Để giải quyết vấn đề này, tôi cho rằng bạn có thể quá tải một trong các tiêu đề phản hồi đơn giản để bao gồm độ dài nội dung, nhưng điều đó có thể gây ra các vấn đề khác và vẫn không khắc phục được Firefox.

+0

Phải. Bạn có nghĩ rằng điều này nên được nộp dưới dạng lỗi trên Webkit không? –

+0

Có. Hãy thử tìm kiếm đầu tiên, tôi nghĩ rằng tôi đã thấy một lỗi về điều này trước đây, nhưng tôi không thể tìm thấy nó ngay bây giờ. – monsur

5

Tôi đã có cùng một vấn đề, cho đến khi tôi tìm thấy một sợi ở một nơi khác mà dạy tôi thêm dòng này vào .htaccess của tôi:

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

Sau đó BOOM, nó đã cố định.

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers để biết chi tiết – broofa

Các vấn đề liên quan