修改说明:这个问题是关于为什么XMLHttpRequest/fetch等。在浏览器上,Postman不受相同访问策略限制(您会收到提到CORB或CORS的错误)。这个问题不是关于如何修复“No‘Access Control Allow Origin’…”错误。这是关于它们发生的原因。

请停止发布:阳光下每种语言/框架的CORS配置。而是找到相关语言/框架的问题。允许请求绕过CORS的第三方服务用于关闭各种浏览器的CORS的命令行选项


我试图通过连接RESTful API内置Flask来使用JavaScript进行授权。但是,当我发出请求时,我会收到以下错误:

XMLHttpRequest cannot load http://myApiUrl/login. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'null' is therefore not allowed access.

我知道API或远程资源必须设置标头,但当我通过Chrome扩展Postman发出请求时,为什么它会起作用?

这是请求代码:

$.ajax({
      type: 'POST',
      dataType: 'text',
      url: api,
      username: 'user',
      password: 'pass',
      crossDomain: true,
      xhrFields: {
        withCredentials: true,
      },
    })
      .done(function (data) {
        console.log('done');
      })
      .fail(function (xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
        alert(textStatus);
      });

当前回答

对我来说,我遇到这个问题是因为不同的原因,远程域被添加到源,部署的应用程序工作得很好,除了一个端点我遇到了这个问题:

Origin https://mai-frontend.vercel.app is not allowed by Access-Control-Allow-Origin. Status code: 500

and

Fetch API cannot load https://sciigo.herokuapp.com/recommendations/recommendationsByUser/8f1bb29e-8ce6-4df2-b138-ffe53650dbab due to access control checks.

在更新Heroku数据库表后,我发现我的Heroku数据表并不包含本地表的所有列。

其他回答

要解决此问题,请在后台使用的doGet()或doPost()函数中编写这行代码

response.setHeader(“访问控制允许来源”,“*”);

您可以键入正在访问网站的网站或API URL端点,而不是“*”,否则它将是公共的。

应用CORS限制是由服务器定义并由浏览器实现的安全功能。

浏览器查看服务器的CORS策略并尊重它。

然而,Postman工具并不关心服务器的CORS策略。

这就是为什么CORS错误出现在浏览器中,而不是Postman中。

解决方案和问题来源

您正在向不同的域发出XMLHttpRequest,例如:

域一:some-Domain.com域二:some-different-Domain.com

域名的这种差异触发了名为SOP(同源策略)的CORS(跨源资源共享)策略,该策略强制在Ajax、XMLHttpRequest和其他HTTP请求中使用相同的域(因此是源)。

当我通过Chrome扩展发出请求时,为什么它会起作用邮递员

客户端(大多数浏览器和开发工具)可以选择强制执行同源策略。

大多数浏览器强制执行同源策略,以防止与CSRF(跨站点请求伪造)攻击相关的问题。

Postman作为一种开发工具,在某些浏览器强制执行SOP时选择不强制执行SOP,这就是为什么您可以通过Postman发送请求,而不能使用浏览器通过JS通过XMLHttpRequest发送请求。

如果网关超时太短,并且正在访问的资源的处理时间比超时时间长,则也可能会出现此错误。这可能是复杂数据库查询等的情况。因此,上述错误代码可以掩盖这个问题。只需检查错误代码是否为504,而不是Kamil的答案中的404或其他内容。如果是504,那么增加网关超时可能会解决问题。

在我的情况下,可以通过禁用Internet Explorer浏览器中的同源策略(CORS)来删除CORS错误,请参阅如何禁用同源策略Internet Explorer。这样做之后,日志中出现了纯504错误。

您得到的错误是由于CORS标准,该标准对JavaScript如何执行ajax请求设置了一些限制。

CORS标准是客户端标准,在浏览器中实现。因此,阻止调用完成并生成错误消息的是浏览器,而不是服务器。

Postman没有实现CORS限制,这就是为什么当您从Postman发出相同的呼叫时,不会看到相同的错误。

邮差为什么不实施CORS?CORS定义了与发起请求的页面的源(URL域)相关的限制。但在Postman中,请求并非来自具有URL的页面,因此CORS不适用。