Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 已忽略访问控制公开标头设置_Jquery_Ajax_Apache_Http Headers - Fatal编程技术网

Jquery 已忽略访问控制公开标头设置

Jquery 已忽略访问控制公开标头设置,jquery,ajax,apache,http-headers,Jquery,Ajax,Apache,Http Headers,在我的Apache web服务器配置中,我添加了对两个不属于标准six的头的支持: Header set Access-Control-Allow-Origin "*" Header set Access-Control-Expose-Headers: Content-Disposition,X-Filename 我的文件导出CGI脚本打印包含这两个字段数据的标题,例如: ... print "Content-Disposition: attachment; filename=%s\n" %

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

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请求中检索
内容处置
的值:

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
字段中返回文件数据,但对于响应头
Content Disposition
,我得到
null

换句话说,
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'))
的结果为空:

null
为什么我的AJAX请求无法检索
内容配置的值,而我已经通过web服务器配置显式地提供了它,并且在响应中正确地设置了它


为了解决换行符的问题,我使用了
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响应仍然看不到这两个头,这两个都是
null

访问控制公开标题
仅适用于CORS请求:
内容处置
X-Filename
在您的情况下被添加到六个标准标题中,允许另一个域查看它是否从您的服务器请求数据

不过,您发送的请求看起来不像是跨源的:URL
services/export_data.py
没有指向另一个域,并且
console.log(jqXHR.getAllResponseHeaders())
的输出包括
Server
Date
之类的头,这些头不在六个标准头和两个公开头中


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

CGI脚本似乎是用Python编写的(基于URL中的文件扩展名)。如果是这种情况,
print“\n”
实际上打印了两个换行符,并且由于一个空行分隔了HTTP中的头和数据,您要添加的两个头将包含在HTTP响应中,但被视为数据而不是头。在添加
内容处置
之前,是否有任何
打印
语句?这就解释了为什么它也没有显示为标题

要解决此问题,只需删除脚本中的尾部
\n

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

响应中是否包含标题(您能在浏览器的开发人员控制台中看到它们吗)?@AlexReynolds当您使用python
print
时,您不必添加新的换行符,因为
print
实际上添加了换行符。您确定启用了Apache模块吗?当我从另一个域调用AJAX并返回标题时,它在我身上完美地工作,没有新行字符字符串终止。请查看此处的屏幕截图:。我不能给你一个链接,因为我在一个虚拟机上运行Apache服务器,但是如果你想看到它,我可以让它可用。我用一个工作示例打开了运行Apache 2.4的VM。您可以在这里使用AJAX调用尝试工作脚本,如果检查源代码,您将看到url位于不同的服务器上。
print
sys.stdout.write
都在工作,并在控制台窗口输出标题。请参见此处的控制台屏幕截图。您是否检查了日志文件中的潜在错误?AJAX调用是否返回
200 Success
?您正在编写
,不幸的是,AJAX响应仍然看不到这两个标题。它们是否真的存在于响应中,并且对Javascript代码不可见,或者根本不包含在响应中?你能用标题和可能包含的数据的前几个字节发布原始响应吗?您可以使用浏览器的开发人员控制台或类似于curl的工具来完成这项工作。您可以提供完整的python cgi脚本吗?请记住,如果您在头之前写入任何其他内容,HTTP响应将不会捕获头。如果在脚本写入头之前没有输出,那么使用
sys.stdout.write
的示例应该可以工作。(我还假设您在使用
sys.stdout
之前正在导入
sys
库。