我决定发布针对此问题的完整解决方案,因为已经提供的答案(虽然在技术上是正确的)在我这种特殊情况下不起作用。诀窍是执行以下操作:
1.添加<customHeaders>
在<httpProtocol>
web.config中
就像上面的@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>
2.覆盖PHP的默认处理程序,并删除OPTIONSVerbHandler
下一步(@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)PHPv5.4php-cgi.exe" resourceType="Either" requireAccess="script" /></handlers>
3.删除通过您的应用程序代码设置的所有响应标头
这是造成最多问题的难题的最后一部分。由于IIS已经添加了
<customHeaders>,所以我在上面的问题中共享的PHP代码段正在复制它们。这在浏览器级别引起了问题,该问题无法对相同类型的多个标头做出很好的响应。
最终web.config
解决了这个问题
<?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)PHPv5.4php-cgi.exe" resourceType="Either" requireAccess="script" /> </handlers> </system.webServer></configuration>注意 :虽然@hcoat和@Bing Han的答案在此问题中都很有用,但我只能将其中的一项奖励。我决定将其交给@Bing
Han,因为他的回答使我离解决方案最近(而且我无法通过自己的搜索找到添加自定义PHP处理程序的方法)。
更新 :我已经编辑了答案,以添加对HTTP DELETE方法的支持以及原始答案中缺少的支持。



