不允许使用 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 MappingAdd Module Mapping 对话框中使用以下值。 Request path - * Module - ProtocolSupportModule Executable - [留空] Name - [随便你] 点击Request RestrictionsMapping 选项卡中,取消选中Invoke handler only if request is mapped toVerbs 选项卡中确保选择OPTIONSAccess 选项卡中选择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中删除&lt;remove name="OPTIONSVerbHandler" /&gt;这一行

【讨论】:

【参考方案3】:

在我的情况下,我必须转到 Handler Mappings,切换到 Ordered View,然后将 OPTIONSVerbHandler 一直移动到列表顶部。

【讨论】:

以上是关于不允许使用 CORS 405 方法的主要内容,如果未能解决你的问题,请参考以下文章

修复不同本地主机之间的“cors”请求。 405(不允许的方法)

CORS 预检的响应是 405(不允许的方法)错误

Angular $http CORS 405 方法不允许

错误 405 - IIS Express 10 不允许使用 CORS for Web API 的方法

Django/DRF - 405 方法不允许删除操作

Angular 7:发送 post 请求给出错误 405(不允许的方法)