【问题标题】:AJAX'ing blob to another domain via CORSAJAX'ing blob 通过 CORS 到另一个域
【发布时间】:2015-01-27 09:06:56
【问题描述】:

谁能告诉我为什么这个请求未能通过 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 请求,我不知道为什么或我正在做的事情是否真的被禁止。

[研究工作:当我找到 this question 时,我抱有希望,但重复的答案通常只涉及 CORS,而不是 blob,根据 OP 的问题]

【问题讨论】:

    标签: javascript php ajax cors same-origin-policy


    【解决方案1】:

    经过大量挖掘和实验,我找到了一种解决方法:即将编码从application/octet-stream更改为application/x-www-form-urlencoded

    对于前者,请求被阻止,即使调用的 Web 服务明确允许 CORS 的调用者域。后者允许调用者域通过。

    但是,这带来了一个新问题:以这种方式发送的数据,至少发送到 PHP Web 服务,可能会超过max_input_vars stat。

    这可以通过增加它来克服,通过一个 .htaccess 文件,像这样:

    php_value max_input_vars 50000000
    

    【讨论】:

    • This article on MDN 解释了原因。 TL;DR:对于非标准编码,您必须使用预检 CORS 请求,而不是简单的请求。最大的警告是你不能用这些来Access-Control-Allow-Origin: *
    • 啊哈,所以它被记录在案,而不是一个错误。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2014-09-14
    • 2015-12-02
    • 2019-08-30
    相关资源
    最近更新 更多