在this question中使用pluploader失败后,我现在正在尝试FineUploader。
在阅读完CORS之后,我在IIS6服务器上实现了各种标头。
似乎发生的事情是我的脚本触发了第一个(preflight
)授权请求,该请求失败,但Chrome允许第二个(standard
)请求无论如何都要发送 - Firefox不会。我认为这实际上是代表Chrome的错误,但至少它让我能够确定我的脚本可能正常工作。
以下是Chrome和FF中的第一个(预检)请求:
OPTIONS /frog/LOTS/upload/php.php HTTP/1.1
Host: staff.curriculum.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://frogserver.curriculum.local
Access-Control-Request-Method: POST
Access-Control-Request-Headers: cache-control,x-requested-with
Pragma: no-cache
Cache-Control: no-cache
Access-Control...
标题是我添加到IIS的标题。
以下是我的回复标题:
HTTP/1.1 403 Forbidden
Content-Length: 1758
Content-Type: text/html
Server: Microsoft-IIS/6.0
x-powered-by: ASP.NET
Access-Control-Allow-Origin: http://frogserver.curriculum.local
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Cache-Control
Access-Control-Allow-Methods: OPTIONS, GET, POST
Access-Control-Expose-Headers: Origin, X-Requested-With
Date: Mon, 22 Apr 2013 15:19:20 GMT
我已尝试将两者并排比较,但我找不到任何可能导致preflight
请求返回403 Forbidden
错误的标题。
我还没有包含我的PHP源码,因为它有很多代码。可以说它在Chrome中可以正常工作并且文件已正确上传,因此脚本应正确无误。唯一可能值得一提的是我在脚本开头有header("Content-Type: text/plain");
。将其更改为text/html
对Chrome或FireFox没有任何影响。
JavaScript非常简单:
$('#jquery-wrapped-fine-uploader').fineUploader({
request: {
endpoint: 'http://staff.curriculum.local/frog/LOTS/upload/php.php'
},
cors: {
expected: true, //all requests are expected to be cross-domain requests
sendCredentials: true //if you want cookies to be sent along with the request
}
});
有人可以帮忙吗?我今天在这个单一的问题上花费了8个小时,而且我< m><接近撕开我自己的脸.... !!
提前致谢,
答案 0 :(得分:5)
正如我的评论中所提到的,这似乎与您的服务器有关。出于某种原因,它拒绝了初始的OPTIONS请求。您需要查看服务器日志,以了解服务器使用403响应此请求的原因。
用户代理发送此初始OPTIONS(飞行前)请求。 Fine Uploader不直接发送此请求,用户代理将其发送为符合the CORS spec。如果您对CORS有特定问题,可以查看my blog post有关Fine Uploader如何处理CORS的信息,或/并且您可以阅读this excellent MDN article on CORS。
答案 1 :(得分:3)
这花了我一个星期,但我终于找到了问题。
默认情况下, IIS6不支持.php文件上的OPTIONS谓词(或.asp(x))。
因此,根本没有认识到OPTIONS
预检电话。
要在IIS6中更改此值,请按照下列步骤操作:
OPTIONS
添加到可用动词列表中(现在应显示REQUEST, GET, POST, OPTIONS
)如果我的PHP脚本中没有以下代码,我就无法使用Internet Explorer:
/* Is the request from Internet Explorer? */
if( !isset( $_SERVER['HTTP_X_REQUESTED_WITH'] )
|| ( isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest" ) ) {
/* If so, we need to send a UUID and iframe XSS response script... */
header("Content-Type: text/html");
/* This needs some extra security, for sure */
if( $result["success"] == "true" )
$result["uuid"] = $_POST["qquuid"];
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
echo "<script src='iframe.xss.response-3.4.1.js'></script>";
} else {
/* Otherwise, we can just echo the json'd result */
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
}
我给了Ray Nicholus 50分的赏金,虽然我没有发现他的态度特别有帮助,但他一直都是对的。但是,为了让其他人看到这个帖子有类似的问题,我会将我的答案标记为正确。