忽略Access-Control-Expose-Headers设置

时间:2017-03-04 19:51:58

标签: jquery ajax apache http-headers

在我的Apache Web服务器配置中,我添加了对两个不属于标准六的标头的支持:

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Expose-Headers: Content-Disposition,X-Filename

我的文件导出CGI脚本打印包含这两个字段数据的标题,例如:

...
print "Content-Disposition: attachment; filename=%s\n" % (out_fn)
print "X-Filename: %s\n" % (out_fn)
...

我的客户端AJAX调用尝试在成功的AJAX请求中检索Content-Disposition的值:

var export_form = new FormData();
export_form.append("settings", JSON.stringify(settings));
export_form.append("format", format);
$.ajax({
    url: "services/export_data.py",
    type: "POST",
    async: true,
    cache: false,
    data: export_form,
    processData: false,
    contentType: false,
    success: function(response, textStatus, jqXHR) {
        console.log("success");
        console.log(jqXHR.getAllResponseHeaders());
        console.log(jqXHR.getResponseHeader('Content-Disposition'));
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("export_form submit failed:", jqXHR.status, jqXHR.statusText);
        console.log(jqXHR);
    }
});

我在客户端的测试请求完成并运行success回调,然后我在response字段中返回文件数据,但我得到null的响应标头{ {1}}。

换句话说,Content-Disposition的样本结果是:

console.log(jqXHR.getAllResponseHeaders())

Date: Sat, 04 Mar 2017 19:42:27 GMT Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_python/3.5.0- Python/2.7.5 mod_perl/2.0.10 Perl/v5.16.3 Transfer-Encoding: chunked Content-Type: application/pdf Access-Control-Allow-Origin: * Access-Control-Expose-Headers: Content-Disposition,X-Filename Connection: Keep-Alive Keep-Alive: timeout=5, max=100 的结果为空:

console.log(jqXHR.getResponseHeader('Content-Disposition'))

为什么我的AJAX请求无法检索null 的值,当我通过Web服务器配置明确提供它时,我已在响应中正确设置它?

为了解决换行问题,我使用Content-Disposition来更好地控制输出,例如:

sys.stdout.write

不幸的是,通过sys.stdout.write("Content-Type: %s\n" % (mime_type)) sys.stdout.write("Content-Disposition: attachment; filename=%s\n" % (output_fn)) sys.stdout.write("X-Filename: %s\n" % (output_fn)) sys.stdout.write("Content-Description: File to download\n\n") with open(out_fn, "rb") as out_fh: sys.stdout.write(out_fh.read()) console.log(jqXHR.getResponseHeader('Content-Disposition')),这两个标头仍然无法通过console.log(jqXHR.getResponseHeader('X-Filename'))显示在AJAX响应中。

1 个答案:

答案 0 :(得分:0)

Access-Control-Expose-Headers仅适用于CORS请求:您的案例中的Content-DispositionX-Filename会添加到六个标准标头中,如果它从您的服务器请求数据,则允许其他域查看。

您发送的请求看起来不像是跨域的:网址services/export_data.py不指向其他域,console.log(jqXHR.getAllResponseHeaders())的输出包含{{1}这样的标题不在六个标准和两个公开标题中的}或Server

我认为您的问题是服务器端,而不是Javascript,并且您实际上并没有发送要包含的两个标头。

CGI脚本似乎是用Python编写的(基于URL中的文件扩展名)。如果是这种情况Date实际上打印了两个换行符,并且由于空行界定了HTTP中的标题和数据,您添加的两个标题将包含在HTTP响应中,但被视为数据而不是标题。在添加print "\n"之前是否有print声明?这可以解释为什么它也没有显示为标题。

要解决此问题,只需删除脚本中的尾随Content-Disposition

\n