Javascript 如何从跨域Ajax请求访问内容长度头?

Javascript 如何从跨域Ajax请求访问内容长度头?,javascript,ajax,header,cross-domain,cors,Javascript,Ajax,Header,Cross Domain,Cors,在使用Ajax下载资源之前,我的JavaScript应用程序需要确定资源的长度。通常这不是问题,您只需发出HEAD请求并提取内容长度 var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"}) xhr.getResponseHeader("Content-Length") // "2195" 但是,资源存储在与客户端不同的服务器上。(我控制的服务器)。因此,我使用CORS进行跨域ajax请求,并设置了服务器以响应H

在使用Ajax下载资源之前,我的JavaScript应用程序需要确定资源的长度。通常这不是问题,您只需发出HEAD请求并提取
内容长度

var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")  
// "2195"
但是,资源存储在与客户端不同的服务器上。(我控制的服务器)。因此,我使用CORS进行跨域ajax请求,并设置了服务器以响应HEAD请求的预处理请求,以及使用自定义header的GET/POST请求

这基本上很有效,但在使用CORS时,我似乎找不到从头部响应中提取
内容长度的方法:

var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// ERROR: Refused to get unsafe header "Content-Length"
我尝试过在预处理或响应中设置各种标题,例如

Access-Control-Expose-Headers: Content-Length
该规范似乎建议应使其可用。但无论我做什么,我似乎都无法使内容长度标题对客户端可用。有什么建议吗


(Chrome 8)

我发现所有浏览器对CORS响应头的支持都存在缺陷。在Chrome/Safari中,我只看到简单的响应头(http://www.w3.org/TR/cors/#terminology)在getAllResponseHeaders()的结果中,即使在响应中设置了“Access Control Expose Headers”头。在Firefox 3.6.13中,getAllResponseHeaders()不返回任何内容(甚至不返回简单的响应头)。作为一种解决方法,我想您可以重载其中一个简单响应标题以包含内容长度,但这可能会导致其他问题,并且仍然无法修复Firefox。

我也遇到了同样的问题,直到我在其他地方找到一个线程,该线程教会我在.htaccess上添加这一行:

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

然后砰的一声,它被修好了。

对。你认为这应该在Webkit上作为bug归档吗?是的。试着先搜索一下,我想我以前看到过一个bug,但现在找不到了。详情