为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作
Posted
技术标签:
【中文标题】为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作【英文标题】:Why are my POST requests blocked by CORS when deployed but it works locally为什么我的 POST 请求在部署时被 CORS 阻止但它在本地工作 【发布时间】:2022-01-21 11:07:57 【问题描述】:我有一个 Angular 9 前端和一个 VB.NET Web API 2 后端。
在本地运行时,它工作正常,但是当它们部署时,所有 POST 请求都被 CORS 阻止。 (GET 工作正常,虽然这似乎只是因为它们不会触发预检检查,因此 CORS 不相关。如果我在这个假设上错了,请纠正我!)
前端位于 mydomain.com,后端位于 api.mydomain.com 的子域中。 它们都托管在同一台服务器上(Godaddy 共享 Windows 托管,通过 Plesk 的 IIS 8)
我的 web.config 中有这个:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept, authorization" />
</customHeaders>
</httpProtocol>
[...]
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
这在 Global.asax 中:
Protected Sub Application_BeginRequest()
If Request.Headers.AllKeys.Contains("Origin") AndAlso Request.HttpMethod = "OPTIONS" Then
Response.Flush()
End If
End Sub
发送 POST 请求时,我会在控制台中收到这些:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.mydomain.com/xyz. (Reason: CORS preflight response did not succeed). Status code: 405.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.mydomain.com/xyz. (Reason: CORS request did not succeed). Status code: (null).
如果我在浏览器开发工具的“网络”选项卡中检查标头,请求中的“Origin”标头与响应中的“access-control-allow-origin”标头具有相同的值。
为什么这不起作用,即使允许的来源设置为“*”? (改变这将是下一个有趣的问题......)
这似乎是一个常见问题,因为我已经阅读了无数 SA 问题和其他文章,但仍然找不到缺失的内容!
【问题讨论】:
我不确定 asp.net,但看起来您的选项调用失败而不是 post 调用。无论Response.Flush()
做什么,尝试评论它并拨打电话。如果可行,请在 Options 调用中检查您为什么这样做。
嗯,是的,选项调用失败并且不允许浏览器自己发送 post 调用。我从这里得到的那段代码:***.com/questions/27504256/…,没有它,即使在 localhost 上也不起作用。
【参考方案1】:
我在阅读了之前评论中提到的one of the threads之后找到了答案。
基本上从web.config
中去掉这一行:
<remove name="OPTIONSVerbHandler" />
我曾多次看到此内容被提及为添加以使其正常工作,因为它默认存在于我的文件中,所以我从未接触过它。
据我了解,这告诉 IIS 是处理选项请求还是由您的代码决定。
【讨论】:
以上是关于为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作的主要内容,如果未能解决你的问题,请参考以下文章
当我部署我的网站时,客户端发布/获取被 CORS 阻止的请求
来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查
CORS 正在阻止 PUT、DELETE 和 POST 请求,但 GET 正在工作