通过CORS将Blob AJAX到另一个域

6 浏览
0 Comments

通过CORS将Blob AJAX到另一个域

有人能告诉我为什么这个请求无法通过SO策略限制吗?

JS:

var blob = new Blob([req.response], {type: "application/octet-stream"});
req = new XMLHttpRequest();
req.open("POST", ws_path(other_context, 'receive_pkg'), true);
req.onload = function (evt) { alert(req.response); };
req.send(blob);

在另一个域上调用的PHP页面:

header('Access-Control-Allow-Origin: *');
file_put_contents('log.txt', 'script accessed');

请求确实发送出去了,并且日志写入了,但浏览器阻止了响应。我有另一个请求发送到相同的脚本,不是一个 blob,而是一个普通的 POST 请求,这个请求可以正常响应。问题似乎只出现在 blob 请求上,我不知道为什么,也不确定我所做的是否被禁止。

[研究努力:当我找到这个问题时,我对此抱有希望,但是重复的答案只涉及CORS,而不是blob,与提问者的问题不符]

0
0 Comments

问题出现的原因是使用了application/octet-stream编码的请求被阻止,尽管调用的Web服务明确允许CORS的调用方域名。而将编码更改为application/x-www-form-urlencoded后,调用方域名就可以通过。

然而,这带来了一个新的问题:以这种方式发送的数据(至少对于PHP Web服务来说)很可能会超出max_input_vars的限制。

可以通过增加.htaccess文件中的php_value max_input_vars 50000000来解决这个问题。

MDN上的这篇文章解释了其中的原因。简而言之,对于非标准的编码,必须使用预检CORS请求,而不是简单的请求。最大的限制是不能使用Access-Control-Allow-Origin: *

所以,这并不是一个错误,而是有文档记录。感谢这个提示。

0