通过CORS将Blob AJAX到另一个域
通过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,与提问者的问题不符]
问题出现的原因是使用了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: *
。
所以,这并不是一个错误,而是有文档记录。感谢这个提示。