0

我在 CORS 环境中工作正常。我可以在 IE8 + IE9 中显示成功响应,进度条变为绿色,响应数据为成功,以及附加到 json 响应的脚本标记,我的图像正在上传到服务器.. 一切都很好。

不过,我有点难以让相同的代码在现代浏览器中工作。例如,Chrome 正在返回成功 true 并且 json 块返回上传的图像(正确上传到服务器),但是响应具有脚本标签,并且插件向用户显示错误响应..所以我几乎就在那里,一切正在工作,但无论使用哪种浏览器,都会添加脚本标签。

现在,根据以下页面:http ://blog.fineuploader.com/2013/01/31/cors-support-in-3-3/ ,'传入的上传请求是通过隐藏的表单提交发送的iframe 如果请求没有 X-Requested-With 标头,或者 X-Requested-With 标头的值不是XMLHttpRequest'. 所以我在 php 中检查以下变量:echo $_SERVER['HTTP_X_REQUESTED_WITH'];并且它在 Chrome 中返回为未定义。

我的完整检查如下:

if ((!isset($_SERVER['HTTP_X_REQUESTED_WITH'])) || (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest")) {
header("Content-Type: text/html");
    $result['uuid'] = $_REQUEST['qquuid'];
    echo json_encode($result);
    echo "<script src=\"http://".$_SERVER['HTTP_HOST']."/frontend/js/iframe.xss.response-3.7.1.js\"></script>";
} else {
    header('Content-Type: text/plain');
    echo json_encode($result);
}

因此,无论浏览器如何,首先如果块失败并且我每次都返回脚本响应。

我可以在我的选项响应标头中看到允许的“X-Requested-With”标头。但是我没有看到这个值是通过实际的上传请求传递的,所以很明显它不能在 if 语句中检查。所以我可以看到我的代码在哪里失败,我只是不确定我需要做什么才能在第二次调用中获取标题,我需要手动添加它吗?..

有点迷失,将不胜感激任何帮助。谢谢。

更新这是我正在使用的 代码 http://shapevoid.com/code.png

选项请求/响应 选项 http://shapevoid.com/options-request.jpg

上传请求/响应 上传 http://shapevoid.com/upload-request.jpg

4

1 回答 1

0

每次上传请求时,Fine Uploader 始终将 X-Requested-With 标头发送到传统端点。正如 Mark 提到的,您没有正确处理 OPTIONS/preflight 请求。OPTIONS 请求当然不包含任何非标准的标头。此请求由浏览器发送,而不是 Fine Uploader。您必须确认 OPTIONS 请求。如果您确认预检(通过响应中的适当 Access-Control-Allow-* 标头),则将发送基础上传请求,其中包含 X-Requested-With 标头。在预检请求中,X-Requested-With 标头会在 Access-Control-Request-Headers 请求标头中提及。我建议您查看我在博客文章中提到的链接,该链接更详细地介绍了 CORS 支持。(https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS)。

我可以向您保证 X-Requested-With 标头存在于基础请求中。如果您没有在服务器端看到它,那么您的代码存在一些问题。查看 Chrome 中的网络选项卡以了解详细信息。

于 2013-10-02T14:20:09.937 回答