由于CORS,Azure网站上的HTTP OPTIONS请求失败
我最近将我们的服务器从Rackspace CloudSites(在Apache / Linux上运行)转移到了Windows Azure网站。 自迁移以来,我们的REST API上的所有jQuery AJAX请求都因CORS而失败。
我们使用自定义标头,因此jQuery在运行实际API调用之前会发出Pre-flight HTTP OPTIONS请求。 问题是OPTIONS请求似乎没有到达我的PHP代码,而是由我似乎无法控制的其他实体(显然是Web服务器)返回。
我已经使用以下标题几年了所以我很确定问题不在PHP代码中:
output->set_header("Access-Control-Allow-Origin: *"); $this->output->set_header("Access-Control-Allow-Methods: GET,POST,DELETE,HEAD,PUT,OPTIONS"); $this->output->set_header("Access-Control-Allow-Headers: X-Olaround-Debug-Mode, Authorization, Accept"); $this->output->set_header("Access-Control-Expose-Headers: X-Olaround-Debug-Mode, X-Olaround-Request-Start-Timestamp, X-Olaround-Request-End-Timestamp, X-Olaround-Request-Time, X-Olaround-Request-Method, X-Olaround-Request-Result, X-Olaround-Request-Endpoint" ); ?>
我猜这个问题是特定于Azure网站的,因为代码似乎在我的开发机器(Windows 8 / IIS 8.0)上运行良好。 我是Azure的新手(以及一般的基于Windows的托管),所以我几乎不知道如何处理和调试此问题,因为Azure网站允许非常小的控制。
我决定发布一个完整的解决方案来解决这个问题,因为已经提供的答案(虽然在技术上是正确的)对我来说在这个特殊情况下不起作用。 诀窍是做以下事情:
1.在web.config中的
中添加
就像上面提到的@hcoat一样,添加system.webServer.httpProtocol.customHeaders
是解决问题的第一步(我之前已经尝试过这个,但它没有用)。 在此处添加为CORS设置所需的所有自定义标头和HTTP方法。
2.重写PHP的默认处理程序并删除OPTIONSVerbHandler
下一步(@Bing Han提供的解决方案)是删除IIS中定义的默认OPTIONSVerbHandler
,还设置自定义PHP54_via_FastCGI
处理程序,该处理程序接受您的其他HTTP方法。 默认处理程序仅适用于GET,POST和HEAD请求。
看一下这篇文章,了解内部工作的更多细节 。
3.删除通过应用程序代码设置的所有响应标头
这是造成大多数问题的最后一块拼图。 由于IIS已经添加了
,我在上面的问题中分享的PHP代码片段正在复制它们。 这导致浏览器级别的问题,这些问题对同一类型的多个标头没有很好的响应。
适用于此问题的最终web.config
注意 :虽然@hcoat和@Bing Han的答案在这个问题上都很有用,但我只能将赏金奖励给其中一个。 我决定把它交给@Bing Han,因为他的回答让我最接近解决方案(我无法找到一种方法从自己的搜索中添加自定义PHP处理程序)。
更新 :我已经编辑了答案,以添加对HTTP DELETE方法的支持,原始答案中缺少该方法。
HTTP OPTIONS请求失败,因为默认的PHP-CGI处理程序不处理“ OPTIONS
”动词。
在web.config
文件中添加以下代码将解决问题。
我有一篇博文: http : //tekblg.blogspot.sg/2013/09/azure-websites-php-cross-domain-request.html
在Windows服务器上,您不能依赖于CORS的php头。 您需要在站点根目录或应用程序根目录中创建包含以下内容的web.config
。
此过程与设置.htaccess
文件相当,重点是您可以在需要的地方创建它而无需重新配置服务器。