CORS预检请求返回“403 Forbidden”; 后续请求然后仅在Chrome中发送
在这个问题中使用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个小时来处理这个单一的问题而且我已经接近自己的脸了…. !!
提前致谢,
正如我的评论中所提到的,这似乎是您服务器的问题。 出于某种原因,它拒绝了初始的OPTIONS请求。 您将需要查看服务器日志,以查看服务器使用403响应此请求的原因。
用户代理发送此初始OPTIONS(飞行前)请求。 Fine Uploader不直接发送此请求,用户代理将其发送为符合CORS规范 。 如果您对CORS有特定的问题,可以看一下我的博客文章 ,了解Fine Uploader如何处理CORS,或/并且您可以阅读这篇关于CORS的优秀MDN文章 。
这花了我一个星期,但我终于找到了问题。
默认情况下, IIS6不支持.php文件上的OPTIONS谓词 (或者.asp(x))。
因此,根本没有认识到OPTIONS
预检电话。
要在IIS6中更改此值,请按照下列步骤操作:
- 在IIS管理器中,转到根网站目录。 右键单击它并选择“属性”
- 转到主目录选项卡,然后选择底部的“配置”按钮
- 找到您尝试与之通信的脚本的相关文件扩展名,例如.php或.asp,然后单击“编辑”
- 将
OPTIONS
添加到可用动词列表中(现在应该显示REQUEST, GET, POST, OPTIONS
) - 将以下代码添加到PHP脚本中以确定来自IE的响应
如果我的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 ""; } else { /* Otherwise, we can just echo the json'd result */ echo htmlspecialchars(json_encode($result), ENT_NOQUOTES); }
虽然我没有发现他的态度特别有帮助,但他给了Ray Nicholus 50分的赏金,他一直都是对的。 但是,为了让其他人看到这个post有类似的问题,我会将我的答案标记为正确。
- 如何在IE CORS中发送POST数据(使用XDomainRequest)
- 如何避免文件上传时的CORS预检请求?
- Access-Control-Allow-Origin标头不起作用 – 我做错了什么?
- 使用激活码发布小部件(Web应用程序)
- 如何修复没有’Access-Control-Allow-Origin’标题出现’错误
- Access-Control-Allow-Methods不允许DELETE
- 从jQuery到WCF服务的POST在Chrome,Firefox中运行但在IE中不起作用(CORS问题)
- Jquery AJAX:请求的资源上没有“Access-Control-Allow-Origin”标头
- angular-seed web-script.js和cors