由于CORS,Azure网站上的HTTP OPTIONS请求失败

我最近将服务器从Rackspace CloudSites(在Apache / Linux上运行)移至Windows

Azure网站。自迁移以来,由于CORS,我们REST API上的所有jQuery AJAX请求都开始失败。

我们使用自定义标头,因此jQuery在运行实际的API调用之前发出飞行前HTTP

OPTIONS请求。问题是OPTIONS请求似乎没有到达我的PHP代码,而是由其他一些我似乎无法控制的实体(显然是Web服务器)返回的。

我已经使用以下标头已有两年了,因此,我很确定问题不在PHP代码中:

<?php

$this->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网站允许的控制非常少。

回答:

我决定发布针对此问题的完整解决方案,因为已经提供的答案(虽然在技术上是正确的)在我这种特殊情况下不起作用。诀窍是执行以下操作:

回答:

就像上面的@hcoat一样,添加system.webServer.httpProtocol.customHeaders是解决问题的第一步(我以前已经尝试过此操作,但是没有用)。在此处添加您需要为CORS设置的所有自定义标头和HTTP方法。

<httpProtocol>

<customHeaders>

<add name="Access-Control-Allow-Origin" value="*" />

<add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,OPTIONS" />

<add name="Access-Control-Allow-Headers" value="Origin, X-Olaround-Debug-Mode, Authorization, Accept" />

<add name="Access-Control-Expose-Headers" value="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" />

</customHeaders>

</httpProtocol>

回答:

下一步(@Bing

Han提供的解决方案)是删除OPTIONSVerbHandlerIIS中定义的默认值,并设置一个PHP54_via_FastCGI接受附加HTTP方法的自定义处理程序。默认处理程序仅适用于GET,POST和HEAD请求。

<handlers>

<remove name="OPTIONSVerbHandler" />

<remove name="PHP54_via_FastCGI" />

<add name="PHP54_via_FastCGI" path="*.php" verb="GET, PUT, POST, DELETE, HEAD, OPTIONS, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK" modules="FastCgiModule" scriptProcessor="D:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" requireAccess="Script" />

</handlers>

回答:

这是造成最多问题的难题的最后一部分。由于IIS已经添加了<customHeaders>,所以我在上面的问题中共享的PHP代码段正在复制它们。这在浏览器级别引起了问题,该问题无法对相同类型的多个标头做出很好的响应。

回答:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<system.webServer>

<rewrite>

<rules>

<rule name="Imported Rule 1" stopProcessing="true">

<match url="^(.*)$" ignoreCase="false" />

<conditions logicalGrouping="MatchAll">

<add input="{R:1}" pattern="^(dir_path\.php|lolaround|lolaround\.php|app_assets)" ignoreCase="false" negate="true" />

</conditions>

<action type="Rewrite" url="lolaround.php/{R:1}" />

</rule>

<rule name="Imported Rule 2" stopProcessing="true">

<match url="lolaround/(.*)" ignoreCase="false" />

<action type="Rewrite" url="/lolaround.php/{R:1}" />

</rule>

</rules>

</rewrite>

<httpProtocol>

<customHeaders>

<add name="Access-Control-Allow-Origin" value="*" />

<add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,OPTIONS" />

<add name="Access-Control-Allow-Headers" value="Origin, X-Olaround-Debug-Mode, Authorization, Accept" />

<add name="Access-Control-Expose-Headers" value="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" />

</customHeaders>

</httpProtocol>

<handlers>

<remove name="OPTIONSVerbHandler" />

<remove name="PHP54_via_FastCGI" />

<add name="PHP54_via_FastCGI" path="*.php" verb="GET, PUT, POST, HEAD, OPTIONS, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK" modules="FastCgiModule" scriptProcessor="D:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" requireAccess="Script" />

</handlers>

</system.webServer>

</configuration>

:虽然@hcoat和@Bing Han的答案在此问题中都很有用,但我只能将其中的一项奖励。我决定将其交给@Bing

Han,因为他的回答使我离解决方案最近(而且我无法通过自己的搜索找到添加自定义PHP处理程序的方法)。

:我已经编辑了答案,以添加对HTTP DELETE方法的支持以及原始答案中缺少的支持。

以上是 由于CORS,Azure网站上的HTTP OPTIONS请求失败 的全部内容, 来源链接: utcz.com/qa/410382.html

回到顶部