不允许使用 CORS 405 方法
Posted
技术标签:
【中文标题】不允许使用 CORS 405 方法【英文标题】:CORS 405 Method Not Allowed 【发布时间】:2013-03-13 04:04:04 【问题描述】:我一直在关注Mozilla article,了解如何设置我的网站以允许跨站点脚本请求。使用 IIS 管理器,我添加了以下 HTTP 响应标头
Access-Control-Allow-Origin : *
Access-Control-Allow-Headers : Origin, SecurityPrivateKeyID
Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS
尽管如此,当我的浏览器(Firefox 和 Chrome)发送带有自定义 SecurityPrivateKeyID
标头的飞行前请求时,我仍然收到 405 Method Not Allowed
。
请求
OPTIONS /Service/Json/User.svc/ HTTP/1.1
Host: serviceprovider.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
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
Origin: http://client.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: securityprivatekeyid
Connection: keep-alive
回应
HTTP/1.1 405 Method Not Allowed
Allow: GET
Content-Length: 1565
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/8.0
access-control-allow-origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Origin, SecurityPrivateKeyID
Date: Sat, 23 Mar 2013 08:35:03 GMT
直接在http://serviceprovider.com/Service/Json/User.svc/
访问时,该服务运行良好。
关于我做错了什么有什么想法吗?
[请注意,我已将主机文件更改为在我的机器上指向 client.com 和 serviceprovider.com]
[使用 JSONP 的解决方案不会这样做,因为我的 Web 服务必须能够使用 POST、PUT 和 DELETE 方法]
【问题讨论】:
你在使用 jquery ajax 吗? @Floradu88 不,使用 XMLHTTPRequest 的标准 javascript 那么这可能会有所帮助:***.com/questions/667519/… 或这个:***.com/questions/15167738/… 【参考方案1】:我的 IIS 8 实例是全新安装的,看来我需要对 Handler Mappings
进行一些修改
备份 IIS 配置
如果任何建议的更改破坏了您现有的网站,最好备份 applicationhost.config 文件
-
导航到
C:\Windows\System32\inetsrv\config
复制applicationhost.config
删除未使用的处理程序
作为起点,我删除了所有未使用的处理程序映射以减少问题空间。您可以通过直接修改 applicationhost.config
或使用 IIS 管理器来完成此操作
-
打开 IIS 管理器
在服务器节点或单个网站节点上选择处理程序映射功能
手动删除所有不需要的映射。
我的网站以服务为基础,仅依赖于静态文件和带有.aspx
和.svc
文件扩展名的文件。我还手动删除了整个配置文件中对.NET 2.0
的所有引用。
添加选项处理程序
这似乎是解决办法。
-
打开 IIS 管理器
在服务器节点或单个网站节点上选择处理程序映射功能
在左侧列中选择
Add Module Mapping
在Add Module Mapping
对话框中使用以下值。
Request path
- *
Module
- ProtocolSupportModule
Executable
- [留空]
Name
- [随便你]
点击Request Restrictions
在Mapping
选项卡中,取消选中Invoke handler only if request is mapped to
在Verbs
选项卡中确保选择OPTIONS
在Access
选项卡中选择Script
我生成的 Handlers 配置如下所示
<handlers accessPolicy="Read, Script">
<add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
<add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
<add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>
【讨论】:
在动词部分你说选择所有动词但在你的配置文件中动词设置为选项,正确的是什么? @Paleta 我无法再访问配置,但请假设 xml 配置是正确的。希望有人能纠正我的答案。 @Paleta 似乎xml将动词限制为OPTIONS
是正确的。当我们将其设置为 ALL VERBS
时,如文中所述,它仅部分起作用。
@AnthonyElliott 我已更改步骤 5.2 以匹配 xml。
感谢您的详细回答,但不幸的是它对我不起作用(我使用的是 IIS 7.5)。经过 2 天的研究,我发现避免“不允许 405 方法”的唯一可行解决方案是在 Application_BeginRequest
方法中定义 CORS 标头,如本答案中所述 ***.com/a/14631068/827168【参考方案2】:
以我为例:
确保请求中的“Access-Control-Allow-Headers”和“Access-Control-Allow-Methods”小于或等于响应中的。(不要使用“*”)
在Web.config中删除<remove name="OPTIONSVerbHandler" />
这一行
【讨论】:
【参考方案3】:在我的情况下,我必须转到 Handler Mappings
,切换到 Ordered View
,然后将 OPTIONSVerbHandler
一直移动到列表顶部。
【讨论】:
以上是关于不允许使用 CORS 405 方法的主要内容,如果未能解决你的问题,请参考以下文章
修复不同本地主机之间的“cors”请求。 405(不允许的方法)